user-0 提问: C语言数组指针不能进行自增自减以达到遍历数组的作用吗

回复:
user: user-1
content: 引用 12 楼 qq_36450673 的回复:老哥我想问下list（0）变为list（1）时，指针是变化了的，那么申请空间的list（1）地址和一开始的list（1）地址有区别吗？是不是相当于两个不同的指针变量 我觉得 申请空间的list(1)地址和开始的地址是一致的 只不过是指针变量覆盖

user: user-2
content: 老哥我想问下list（0）变为list（1）时，指针是变化了的，那么申请空间的list（1）地址和一开始的list（1）地址有区别吗？是不是相当于两个不同的指针变量

user: user-0
content: 引用 10 楼 lilimite 的回复:2楼大佬说得很对，多调试感受一下，int a[5]={3,4,5,6,7},*p; 	 	p=&a[0];  	 	printf("%d\n",*p);  	//printf("%d\n",*p++);     printf("%d\n",*++p); 	printf("%d\n",*p+1); 用这个代码对比一下。感觉直接对地址自加赋值，指针l所指的空间不一样了 我在分析得时候没有顾及到，沉迷于我自己的理论ａｃ

user: user-3
content: 2楼大佬说得很对，多调试感受一下，int a[5]={3,4,5,6,7},*p; 	 	p=&a[0];  	 	printf("%d\n",*p);  	//printf("%d\n",*p++);     printf("%d\n",*++p); 	printf("%d\n",*p+1); 用这个代码对比一下。感觉直接对地址自加赋值，指针l所指的空间不一样了

user: user-0
content: 好，谢谢楼上几位

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 4 楼 qq_35859033 的回复:] 上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  第一个可以得到两个0，因为List指针没有变化； 第二个输出是2个随机值； *(k->List++) = 2;该表达式有两个运算，第一个运算是将将2复制给k->List[0]，第二个运算是k->List++;即指针指向了初始的List[1]; 没错，开始*(k->List)是给k->List[0]赋值1，但是第二个紧接着是用2覆盖了1；此时List指针已经发生了变化，所以此时的k->List[0]就是申请空间时的List[1]，k->List[1]是开始的List[1]；所以，后面的printf输出两个随机值。*(k->List++) = 2；这样操作会导致内存泄漏，因为找不到申请空间的首地址了，指针指向下一个内存地址（偏移了4字节）； 若第二个表达式变成*(++k->List) = 2;那么输出的是2和一个随机值；这样操作一样会有内存泄露； 解决办法是将k->List指针指向的地址做备份，即int *bak = k->List;这样可以通过bak[0], bak[1]来验证你的赋值是怎样的。另外，free时可以直接free(bak);这样就可以把List申请的空间释放掉，而不会内存泄漏；[/quote] 老哥你分析得很对，是我学的太浅了！

user: user-4
content: 引用 4 楼 qq_35859033 的回复:上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  第一个可以得到两个0，因为List指针没有变化； 第二个输出是2个随机值； *(k->List++) = 2;该表达式有两个运算，第一个运算是将将2复制给k->List[0]，第二个运算是k->List++;即指针指向了初始的List[1]; 没错，开始*(k->List)是给k->List[0]赋值1，但是第二个紧接着是用2覆盖了1；此时List指针已经发生了变化，所以此时的k->List[0]就是申请空间时的List[1]，k->List[1]是开始的List[1]；所以，后面的printf输出两个随机值。*(k->List++) = 2；这样操作会导致内存泄漏，因为找不到申请空间的首地址了，指针指向下一个内存地址（偏移了4字节）； 若第二个表达式变成*(++k->List) = 2;那么输出的是2和一个随机值；这样操作一样会有内存泄露； 解决办法是将k->List指针指向的地址做备份，即int *bak = k->List;这样可以通过bak[0], bak[1]来验证你的赋值是怎样的。另外，free时可以直接free(bak);这样就可以把List申请的空间释放掉，而不会内存泄漏；

user: user-5
content: x++ 和 ++x的区别么? 我也不太理解你的意思 你可以试着单步调试一下

user: user-6
content: 引用 4 楼 qq_35859033 的回复:上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  指针自增是增加一个元素的size 比如p++,原来的p[1]就变成的现在的p[0]了 你又没把它复位,读取就是从p[1]开始的

user: user-0
content: 上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);

user: user-0
content: 引用 2 楼 qq_31709097 的回复:你不是刻舟求剑么,指针都++了,读取的当然也是自增后的 int* p=l 用p读取 老哥你没看明白我的意思    我的意思是想问在这自增运算过程中发生了什么，才造成了赋值的错误 = =、 这是问题的原型  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List) = 2;     printf("%d %d\n", k->List[0], k->List[1]);

user: user-6
content: 你不是刻舟求剑么,指针都++了,读取的当然也是自增后的 int* p=l 用p读取

user: user-0
content: 各位大佬一起交流下啊，指点小弟一下