163585580 发表于 2021-3-31 14:26

c语言指针问题

为什么arr运行出来是1啊?这个怎么理解?求大神{:1_889:}


#include <stdio.h>
#define N 6
void pointer_self_add(){
    int arr[N]={1,2,3,4,6,5};
    int *p;
    int j;
    p=arr;
    j=*p++;//把p赋值给j,在++
    printf("%d,%d,%d\n",arr[0],j,*p);
    j=p[0]++;//把p赋值给j,然后对p++,
    //等价于(*p)++
    printf("%d,%d,%d\n",arr[2],j,*p);
}
int main(){
    pointer_self_add();
    return 0;
}

boy7928 发表于 2021-3-31 14:36

arr运行出来是3 啊
2个打印 分别结果
1,1,2
3,2,3

weliong 发表于 2021-3-31 14:43

运行结果如1楼

小益达 发表于 2021-3-31 15:01

一楼说的没错,个人理解不知道对不对
j=p++;//把p赋值给j,然后对p++,这里的p实际上是arr的地址,后面的你应该自己就懂了

sam喵喵 发表于 2021-3-31 15:10

小益达 发表于 2021-3-31 15:01
一楼说的没错,个人理解不知道对不对
j=p++;//把p赋值给j,然后对p++,这里的p实际上是arr ...

照这么理解的话*P不是等于2?

阳光好青年 发表于 2021-3-31 15:14

https://www.runoob.com/try/runcode.php?filename=helloworld&type=c,菜鸟C 在线编译运行结果:
1,1,2
3,2,3

Luckyu920 发表于 2021-3-31 16:03

#include <stdio.h>
#define N 6
void pointer_self_add(){
    int arr={6,40,5,10,3,20};
    int *p;
    int j;
    p=arr;
    j=*p++;//把p赋值给j,在++,即,j=arr;
    printf("%d,%d,%d\n",arr,j,*p);
        //arr 是第一个元素
        //*p++ 指向下一个元素,即第二个元素,为40
        //故输出 6 6 40
       
       
    j=p++;//把p赋值给j,然后对p++,
    //注意此时指针p指向第二个元素,即j=p=arr=40;
    //等价于(*p)++
    printf("%d,%d,%d\n",arr,j,*p);
    //arr 是第三个元素
        //p=arr=40;
        //然后p++变成41
        //故输出 5 40 41
}
int main(){
    pointer_self_add();
    return 0;
}

我换了里面的元素,也加了注释,你参考看一下哈

wsxzaq 发表于 2021-3-31 16:05

VS结果:
1,1,2
3,2,3.
至于为什么第二*p = 3,是因为p++的缘故:p = 2,++后就变成3。你可以打印出数组,结果为{1,3,3,4,6,5}

aristan 发表于 2021-3-31 16:45

你用什么编译的?我的gcc编译结果为
1,1,2
3,2,3

163585580 发表于 2021-3-31 16:49

wsxzaq 发表于 2021-3-31 16:05
VS结果:
1,1,2
3,2,3.


请问一下,为啥打印数组后arr会变成3
页: [1] 2
查看完整版本: c语言指针问题