Anyiknight 2023-01-08 17:29 采纳率: 100%
浏览 33
已结题

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

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

#include<stdio.h>
#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;i<ROWS;i++)
    {
        for(int j=0;j<COLS;j++)
        {
            printf("%5.2f",target[i][j]);
        }
        printf("\n");
    }
    return 0;
}

void copy_ptr(double *t,double *s,int n)
{
    int i=0;
    for(i=0;i<n;i++)
    {
        *(t+i)=*(s+i);
    }
}

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

  • 写回答

2条回答 默认 最新

  • heart_6662 2023-01-08 17:44
    关注

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

    在 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 类型元素的数组的指针。在使用这种指针的时候,需要注意是取指针变量的值(即所指向的内存地址)还是指针变量的地址。如果要取指针变量的值,那么需要在指针变量前面加 * 符号。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 创建了问题 1月8日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看