黑马程序员技术交流社区

标题: 关于指针数组的一个问题 [打印本页]

作者: ZHYU    时间: 2015-7-28 13:38
标题: 关于指针数组的一个问题
本帖最后由 ZHYU 于 2015-8-13 23:37 编辑


多谢各位朋友的解答,答案已经出来了!
声明变量的时候,是存在栈空间,main函数中,从上往下,变量的地址从大到小,这里打印出了num1和num2的地址;0x
printf("%p\n",&num1);
printf("%p\n",&num2);
0x7fff5fbff79c
0x7fff5fbff798

所以,只需要将*a[0]++  改为,*a[0]--即可!
再次感谢!
========================================================================================

求解:为什么下面的代码打印出来后最后一个值不是3,而是一个很大的数字呢?  

  int num1 =2,num2 = 3;
    int *a[]={&num1,&num2};
    printf("%p=====%d\n",a[0],*a[0]++);
    printf("%p=====%d\n",a[0],*a[0]);

打印结果:
0x7fff5fbff7bc=====2
0x7fff5fbff7c0=====1606416408


作者: Eil.tea    时间: 2015-7-28 13:56
先打印出*a[1]的地址看看,是不是和最后*a[0]的地址相同
作者: 挚兀嘟    时间: 2015-7-28 15:58
printf("%p=====%d\n",a[0],*a[0]++);   这句话执行完之后 a[0] 的地址就变了,指向了一个没有值的地方,所以取出来的数很大,其实是空
作者:   张恒宇    时间: 2015-7-28 22:10
printf("%p=====%d\n",a[0],*a[0]++);执行之后。。。。可以理解为把指针所指向的地址向后移动一位。。。既此时的*a[0]位置修改为*a[1]...这样你要再打印*a[0]时是空值。。。。所取的值是随机的!
作者: 丁铭检    时间: 2015-7-28 22:15
楼上正解。。。
作者:   张恒宇    时间: 2015-7-28 22:19
  张恒宇 发表于 2015-7-28 22:10
printf("%p=====%d\n",a[0],*a[0]++);执行之后。。。。可以理解为把指针所指向的地址向后移动一位。。。既 ...

不能这样理解测试结果表明不是向后移动一位。。。。
作者:   张恒宇    时间: 2015-7-28 22:28
Eil.tea 发表于 2015-7-28 13:56
先打印出*a[1]的地址看看,是不是和最后*a[0]的地址相同

地址改变了。。。不一样的。。。而且当打印a[1]是的数值还是3!这里的*a[0]++到底做了什么操作。。。。。
作者:   张恒宇    时间: 2015-7-28 23:47
通过思考一段时间个人认为是地址改变导致*a[0]初始化失败。。。。所产生的数可能是系统数据,可能上个程序的数据也可能是垃圾数据。。。。仅供参考
作者: Eil.tea    时间: 2015-7-29 01:05
给你个合理的解释,首先num1的地址大于num2的地址。因为我们一直理解定义数组的时候,地址是连续的并且递增的,但是忽略了你这里定义的是指针数组并且为每个指针赋值了,而这个值有恰好是连续的定义的变量,而定义变量的时候先分配的是大的地址,所以你改成 *a[0]--,就能得到你的预期的值了,楼上的同学都说的没错,你*a[0]++指向了一个未知的内存空间,所以会有一个“垃圾数”。
作者: 香港    时间: 2015-7-29 08:04
a[0]++因为是先打印后自加  打印出来的是a[0]打印完就变成了a[1],,,a[0]变了 找不到地址就变成乱码了
作者: skywan    时间: 2015-7-29 09:16
恩恩,懂了
作者: Eil.tea    时间: 2015-7-29 11:45
香港 发表于 2015-7-29 08:04
a[0]++因为是先打印后自加  打印出来的是a[0]打印完就变成了a[1],,,a[0]变了 找不到地址就变成乱 ...

兄弟,你没亲自编译吧,首先a[0]++后,绝对不是a[1]。
作者: chensc    时间: 2015-7-29 19:24
学习学习!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2