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 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分