+ -
当前位置:首页 → 问答吧 → 二重指针的问题

二重指针的问题

时间:2010-08-19

来源:互联网

本帖最后由 cu养猪小能手 于 2010-08-19 22:56 编辑

错误写法:警告:从不兼容的指针类型赋值( *ppi = &pi)并且执行时段错误
  1. #include "stdio.h"
  2. main()
  3. {
  4.     int i;
  5.     int *pi;
  6.     int **ppi;

  7.     i = 1;
  8.     pi = &i;
  9.     *ppi = π

  10.     printf("i is %d\n\n",i);
  11.     printf("pi is %d\n\n",*pi);
  12.     printf("ppi is %d\n\n",**ppi);
  13. }
复制代码
正确写法:
  1. #include "stdio.h"
  2. main()
  3. {
  4.     int i = 1;
  5.     int *pi = &i;
  6.     int **ppi = π



  7.     printf("i is %d\n\n",i);
  8.     printf("pi is %d\n\n",*pi);
  9.     printf("ppi is %d\n\n",**ppi);
  10. }
复制代码
为什么第一种是错误的?

作者: cu养猪小能手   发布时间: 2010-08-19

谁说第一种是错的啊?

作者: zhangsuozhu   发布时间: 2010-08-19

本帖最后由 cu养猪小能手 于 2010-08-19 22:51 编辑

回复 zhangsuozhu


    我这里编译出错啊。

修改:不是编译出错,是执行的时候  段错误

作者: cu养猪小能手   发布时间: 2010-08-19

看代码觉的没啥问题啊

作者: zhangsuozhu   发布时间: 2010-08-19

回复 zhangsuozhu


    第一种写法编译的时候第十行出警告::从不兼容的指针类型赋值,执行的时候段错误。

作者: cu养猪小能手   发布时间: 2010-08-19

本帖最后由 zhangsuozhu 于 2010-08-19 23:10 编辑

想了半天不对.怕以把刚才说的给删了

作者: zhangsuozhu   发布时间: 2010-08-19

回复 zhangsuozhu


    我用的是 gcc 32位linux的。

作者: cu养猪小能手   发布时间: 2010-08-19

本帖最后由 zhangsuozhu 于 2010-08-19 23:44 编辑

*ppi = π

晕.看出来了. ppi = π才对

作者: zhangsuozhu   发布时间: 2010-08-19

回复 zhangsuozhu


    大哥,不行啊,编译的时候报错了:错误:单目‘&’的操作数必须是左值

作者: cu养猪小能手   发布时间: 2010-08-19

本帖最后由 zhangsuozhu 于 2010-08-19 23:47 编辑
  1. i = 1;
  2. pi = &i;
  3. *ppi = π
复制代码
被整晕了.丢人了.   可以这么想pi里存的内容是一个内存地址. pi = &i; 的意思就是向pi里存入&i的内存地址.
*ppi = π 句有问题.为什么这么说呢, ppi里存的是指向另一个内存地址的地址.也就是pi的址.
所以 ppi = &pi 或 *ppi = pi

作者: zhangsuozhu   发布时间: 2010-08-19

回复 zhangsuozhu


     ppi = &pi   
  
    *ppi = pi

两种写法编译都通过。第二种还是段错误。

作者: cu养猪小能手   发布时间: 2010-08-19