请教一下指针与二维数组有关问题

请教一下关于对二维数组使用指针的问题,如下列代码43行,为什么要在(t+i)与(s+i)前面加*符号?在这段代码中t和s指的是什么?换句话说格式如type (*ptr)[n]这样的指针应该怎么理解?它指的是一个指针的地址吗?有点没弄明白这个逻辑问题,求解答。
代码原意是把source二维数组的数据复制进target数组。

#include
#define ROWS 5
#define COLS 12
void copy_ptr(double t[],double s[],int n);
void copy_2d_ptr(double (*t)[COLS],double (*s)[COLS],int n);

int main(void)
{
    double source[ROWS][COLS]={
    {1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2},
    {3.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2},
    {5.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2},
    {7.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2},
    {9.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2}
    };
    double target[ROWS][COLS];
    copy_2d_ptr(target,source,ROWS);
    for(int i=0;ifor(int j=0;jprintf("%5.2f",target[i][j]);
        }
        printf("\n");
    }
    return 0;
}

void copy_ptr(double *t,double *s,int n)
{
    int i=0;
    for(i=0;ivoid copy_2d_ptr(double (*t)[COLS],double (*s)[COLS],int n)
{
    int i;
    for(i=0;icopy_ptr(*(t+i),*(s+i),COLS);
    }
}

望采纳!!!点击回答右侧采纳!!!

在 C 语言中,形如 type (*ptr)[n] 的指针表示一个指针变量,其类型是指向含有 n 个 type 类型元素的数组的指针。


那么在本例中,t 和 s 就是指向含有 COLS 个 double 类型元素的数组的指针。

那么在 43 行的 copy_ptr((t+i),(s+i),COLS); 中,*(t+i) 和 *(s+i) 就表示 t[i] 和 s[i],也就是第 i 行的数组。

所以这里需要在 t[i] 和 s[i] 前面加 * 符号,表示取 t[i] 和 s[i] 的值(即 t[i] 和 s[i] 所指向的内存地址),而不是取 t[i] 和 s[i] 的地址。


如果要调用 copy_ptr 函数,那么需要将 t[i] 和 s[i] 传给函数,而不是 t[i] 和 s[i] 的地址。由于 t[i] 和 s[i] 分别表示一个含有 COLS 个 double 类型元素的数组的首地址,所以需要在 t[i] 和 s[i] 前面加 * 符号,表示取 t[i] 和 s[i] 的值,也就是 t[i] 和 s[i] 所指向的内存地址。

所以这里的 *(t+i) 和 *(s+i) 分别表示 t[i] 和 s[i] 所指向的内存地址。


总的来说,形如 type (*ptr)[n] 的指针表示一个指针变量,其类型是指向含有 n 个 type 类型元素的数组的指针。在使用这种指针的时候,需要注意是取指针变量的值(即所指向的内存地址)还是指针变量的地址。如果要取指针变量的值,那么需要在指针变量前面加 * 符号。

在这段代码中,t 和 s 都是指针,它们指向一个包含 COLS 个 double 类型元素的数组。

C 语言中的数组是一种指针,指向数组的首元素的地址。因此,对于二维数组 t,(t+i) 就是第 i 行的地址,而对于一维数组 t,(t+i) 就是第 i 个元素的值。

因此,在 copy_2d_ptr 函数中,copy_ptr((t+i),(s+i),COLS) 的作用是将 s 的第 i 行的数据复制到 t 的第 i 行。

另外,在 C 中,如果 type(*ptr)[n] 这样的格式出现在函数参数中,它表示 ptr 是一个指针,指向包含 n 个 type 类型元素的数组。