guoquanli 发表于 2020-6-11 09:34:02

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

void fun_1(){
    int a = {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 = {1,2,3,4,5};
    int (*p) = a;//

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


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

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

    int (*p1) = &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
}


松花蛋 发表于 2020-6-11 11:27:12

你fun2定义的是一个指向一维数组的指针,别用*p++输出,用(*p)。关于指针的指针,你代码写的有点乱,我也初学看的不太懂。还有a是数组名,其实就是一个指向第一个元素的指针,不必用取地址运算符&。

sunrise085 发表于 2020-6-11 11:36:17

因为你的程序中数组指针p或者p1都进行过多次自加,早就不是你最开始指向的数组a的地址了。只有最后一种写法是对的。前面几种都不对。之所以没出结果,就是因为p1已经在前面被p1++修改了。
关于数组指针,可以看看下面的帖子
我回答过的帖子

zzc1722584627 发表于 2020-6-11 14:26:41

你这代码看得我头痛 ,只瞄了一下第一个疑问,回答一下吧,
int (*p) = a;//
你这个代码是数组指针,是数据类型为int【5】的一个数组指针,而且你这句代码有问题,应该是 int (*p) = &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)

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

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

    }
    printf("\n");
}

页: [1]
查看完整版本: 数组指针访问数组中的元素