鱼C论坛

 找回密码
 立即注册
查看: 1599|回复: 3

数组指针访问数组中的元素

[复制链接]
发表于 2020-6-11 09:34:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void fun_1(){
    int a[5] = {1,2,3,4,5};
    int *temp = a;
    for(int i = 0; i< 5; i++){
        printf("%d ",*temp++);
    }
    printf("\n");
    //运行结果:1 2 3 4 5
//疑问一:为何该种方式可以取出数组中的内容,下面fun_2中利用数组指针反而取不出来?
}
void fun_2(){
    int a[5] = {1,2,3,4,5};
    int (*p)[5] = a;//

    printf("addr of a:%p\n",p);//0060Fe4a
    for(int i = 0; i < 5;i++){
        printf("%d  ",*p++);
    }
    printf("\n");
    //运行结果:6356660  6356680 6356700 6356720 6356740
//疑问二:上述方法为何没有真确取出数组中的内容


    for(int i = 0; i< 5; i++){
        printf("%d  ",*(*p++));
        //数组指针是二级指针? *p 获取数组元素的地址,*(*p)获取该地址中的元素内容
    }
    printf("\n");
    //运行结果:-2  1966436733  0  0  6356956

    for(int i = 0; i<5;i++){
        printf("%d  ",*(*(p + i) ));
    }
    printf("\n");
    //运行结果: 6356964  2009549335  4199040

    int (*p1)[5] = &a;
    for(int i = 0 ; i<5;i++){
        printf("%d ", *p1++);
    }
    printf("\n");

    //运行结果:1,2,3,4,5

    for(int i = 0; i<5;i++){
        printf("%d ",*(*p1 + i ));
    }
    printf("\n");
    //运行结果:-1 6356820 1966458992 1682321915 -2
    // 小甲鱼老师这样运行是对的,为何我这里运行不出来:运行环境为windows下的codeBlock
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-11 11:27:12 | 显示全部楼层
你fun2定义的是一个指向一维数组的指针,别用*p++输出,用(*p)[i++]。关于指针的指针,你代码写的有点乱,我也初学看的不太懂。还有a是数组名,其实就是一个指向第一个元素的指针,不必用取地址运算符&。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-11 11:36:17 | 显示全部楼层
因为你的程序中数组指针p或者p1都进行过多次自加,早就不是你最开始指向的数组a的地址了。只有最后一种写法是对的。前面几种都不对。之所以没出结果,就是因为p1已经在前面被p1++修改了。
关于数组指针,可以看看下面的帖子
我回答过的帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-11 14:26:41 | 显示全部楼层
你这代码看得我头痛 ,只瞄了一下第一个疑问,回答一下吧,
int (*p)[5] = a;//  
你这个代码是数组指针,是数据类型为int【5】的一个数组指针,而且你这句代码有问题,应该是 int (*p)[5] = &a;这样才对,a的步长是一个元素,&a的步长是一个数组,你想想你指针p是一个int【5】类型,是属于数组类型,赋值为a,a是一个元素是int类型,当然对于指针来说都是地址,这么做也可以。

  for(int i = 0; i < 5;i++){
        printf("%d  ",*p++);
    }
你这句代码问题更大,第一个:for循环已经i++了  , 你p还搞搞一次++
第二个:p指的是数组类型,你要取值不能用p++,应该用 (*p)[i++]

附一个代码:
void fun_2(){
    int a[5] = {1,2,3,4,5};
    int (*p)[5];
    p = &a;

    for(int i = 0; i < 5;i++){
        printf("%d ",(*p)[i]);

    }
    printf("\n");
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表