免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2653 | 回复: 9
打印 上一主题 下一主题

二级指针与数组,一点小困惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-17 11:25 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(int argc, char *argv[])
  4. {
  5.     int a = 1, b = 2, c = 3, d = 4;
  6.     int array[4];
  7.     int *pi = array;
  8.     *pi = a;   
  9.     *(pi + 1) = (int)&b;
  10.     *(pi + 2) = (int)&c;
  11.     *(pi + 3) = (int)&d;
  12.     //如上设置的意思其实就是
  13.     //array[0] = a   array[1]指向b  array[2]指向c array[3]指向d
  14.                            
  15.     int **p = &pi;
  16.     printf("array:%p\n", array);
  17.     printf("p[0] = %p\n", p[0]);      //这里是array的地址,明白
  18.     printf("p[0] = %d\n", p[0][0]); //这里是显示1,也就是a的值,也理解
  19.     printf("p[1] = %d\n", p[1]);     //这里也显示1,为什么????
  20.   //  printf("p[1][0] = %d\n", p[1][0]);     //如果加入这行可以编译通过,但是程序将在此处
  21.                                                         //提前终止,不管是以什么格式打印p[1][0]
  22.    
  23.     int i;
  24.     for (i = 2; i <= 4; i++) {
  25.         printf("array[%d]:%d ----%p\n", i, p[i][0], p[i]);
  26.     }
  27.     printf("b add:%p\n", &b);
  28.     printf("c add:%p\n", &c);
  29.     printf("d add:%p\n", &d);

  30.     return 0;
  31. }
复制代码


按照我的理解,p作为二级指针指向array,那么p[1][0] p[2][0]  p[3][0]应该分别是b c d的值才对啊?
为什么程序显示p[2][0] p[3][0] p[4][0]才是b c d的值呢?
请各位明白人解释一下???非常感谢!!!

[ 本帖最后由 weckay 于 2007-6-17 11:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-06-17 11:43 |只看该作者
原帖由 weckay 于 2007-6-17 11:25 发表

  1. printf("p[1] = %d\n", p[1]);     //这里也显示1,为什么????
复制代码



这一句的输出结果是随机的



原帖由 weckay 于 2007-6-17 11:25 发表

  1. printf("array[%d]:%d ----%p\n", i, p[i][0], p[i]);
复制代码


这句会core dumped

论坛徽章:
0
3 [报告]
发表于 2007-06-17 12:12 |只看该作者
   
    *pi = a;   
    *(pi + 1) = (int)&b;
    *(pi + 2) = (int)&c;
    *(pi + 3) = (int)&d;
    //如上设置的意思其实就是
    //array[0] = a   array[1]指向b  array[2]指向c array[3]指向d

没看见这种写法的

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
4 [报告]
发表于 2007-06-17 12:48 |只看该作者
多读书,没有坏处的。我相信任何一本入门书,都会强调指针的。

论坛徽章:
0
5 [报告]
发表于 2007-06-17 12:56 |只看该作者
原帖由 weckay 于 2007-6-17 11:25 发表
[code]#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int a = 1, b = 2, c = 3, d = 4;
    int array[4];
    int *pi = array;
    *pi = a;   
     ...


ypxing 已经指出你的问题了,把int **p = &pi 换成int **p=array即可。
想一想p指针到底该指向谁。

论坛徽章:
0
6 [报告]
发表于 2007-06-17 13:21 |只看该作者
原帖由 ypxing 于 2007-6-17 11:43 发表


这一句的输出结果是随机的




这句会core dumped

这倒也不是随机的,只要指针还指向栈上,值就是固定的。
就以lz printf("p[1] = %d\n", p[1]);     //这里也显示1,为什么????问题为例
其实你这里栈是如下排列的:

  1. a  4字节(以下每提一行表示占4字节)               高地址
  2. b
  3. c
  4. d
  5. array[3]
  6. array[2]
  7. array[1]
  8. array[0]
  9. pi
  10. p                                                                          地地址
复制代码


这里p指向了pi,所以p[1]=pi+4指向了array[0],所以p[1]的值是1
而p[1][0]表示把p[1]的值作为地址,再取值,也就是访问地址1的内容,当然是segmention fault

论坛徽章:
0
7 [报告]
发表于 2007-06-17 14:13 |只看该作者
在这里我首先谢谢各位的关注,这个程序并不是我写着玩的.我不是大家想想的是个程序初学者,我也不是不了解二级指针和数组的关系.这个程序是我为了理解以前的一个比较老的项目写的测试代码.
因为那个项目是用老式C写的,里面大量使用了指针,就是如上形式使用的.现在老板让我分析这个项目,我一时看不太明白就写了如上的测试程序.但是我并不想在此处讨论程序写法的正确性,我只是想弄清楚我不明白的地方.
还请各位高手不要再程序的正确性上讨论,我想知道的是原因?谢谢!

论坛徽章:
0
8 [报告]
发表于 2007-06-17 14:23 |只看该作者
原帖由 zx_wing 于 2007-6-17 12:56 发表


ypxing 已经指出你的问题了,把int **p = &pi 换成int **p=(int **)array即可。
....


我想我已经搞清楚了,谢谢!

论坛徽章:
0
9 [报告]
发表于 2007-06-17 15:08 |只看该作者
原帖由 weckay 于 2007-6-17 14:13 发表
在这里我首先谢谢各位的关注,这个程序并不是我写着玩的.我不是大家想想的是个程序初学者,我也不是不了解二级指针和数组的关系.这个程序是我为了理解以前的一个比较老的项目写的测试代码.
因为那个项目是用老式C写 ...


恩,知道了实质,没有什么写法不正确。这种用法在底层程序中很常见,例如把一组函数地址存在一个数组中,用一个二级指针引用。只要把变量在内存中存放的规则弄清楚了,任何指针问题都可以想清楚。例如为什么一个二级指针不能引用一个二维数组等等。。。

论坛徽章:
0
10 [报告]
发表于 2007-06-19 16:22 |只看该作者
明明这个指针指向的是一个*p[][4],有p[0][0~3]的值,但是p[0][0]是直接指向地址的值,而p[0][1~3]则是指向的地址.,至于p[1][i]为什么出错,因为根本都没有分配地址,所以没有这个东西是很正常的,当然p[i]是任何时候都有的.呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP