免费注册 查看新帖 |

Chinaunix

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

请问:int *(*ptr)[4];应该怎么理解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-26 22:03 |只看该作者 |倒序浏览
代码:
  1. #include <stdio.h>
  2. main()
  3. {
  4.         int a[4]={2,4,6,8};
  5.         int (*pt)[4]=&a;
  6.         int *(*ptr)[4]=&pt;
  7.         printf("%d\n",(*pt)[0]);
  8.         printf("%d\n",(*ptr)[1]);
  9. }
复制代码

编译、运行:

  1. [wjh@MagicLinux c]$ gcc -g -o pp pp.c
  2. pp.c: In function `main':
  3. pp.c:6: warning: initialization from incompatible pointer type
  4. [wjh@MagicLinux c]$ ./pp
  5. 2
  6. 2
复制代码

如果将代码最后一句改为:

  1. printf("%d\n",(*ptr)[0]);
复制代码

编译、运行:

  1. [wjh@MagicLinux c]$ gcc -g -o pp pp.c
  2. pp.c: In function `main':
  3. pp.c:6: warning: initialization from incompatible pointer type
  4. [wjh@MagicLinux c]$ ./pp
  5. 2
  6. -1075754848
复制代码


被搞糊涂了,请教两个问题:
1、int *(*ptr)[4]是什么意思?怎么理解、使用?

2、printf("%d\n",(*ptr)[0]);为什么没有数值,而要从printf("%d\n",(*ptr)[1]);开始呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-05-26 22:32 |只看该作者
1、ptr是一个指针。
2、ptr指向的是一个有4个元素的数组。
3、这个数组的每个元素是一个指针。
4、这个指针是一个指向int类型的指针。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-05-26 22:33 |只看该作者
第二个问题,ptr没有初始值,是个野指针。

论坛徽章:
0
4 [报告]
发表于 2006-05-26 22:38 |只看该作者
int *(*ptr)[4];
int* (*ptr)[4]; // C++推荐int*, char* ...
pointer to an array of 4 pointers to int
到包含4个到int的指针数组的指针。

记得前不久有过一个类似的帖子。

论坛徽章:
0
5 [报告]
发表于 2006-05-26 22:40 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2006-05-26 23:29 |只看该作者
int *(*ptr)[4]:
就是这个意思  :
typpedef int  *   TYPE1;
typedef TYPE1* TYPE2;
TYPE2  ptr[4];

论坛徽章:
0
7 [报告]
发表于 2006-05-26 23:46 |只看该作者
指向指针数组,而且指针数据的每个元素又是一个指向INT的指针.


[ 本帖最后由 打靶归来 于 2006-5-26 23:50 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-05-26 23:48 |只看该作者
原帖由 connet 于 2006-5-26 23:29 发表
int *(*ptr)[4]:
就是这个意思  :
typpedef int  *   TYPE1;
typedef TYPE1* TYPE2;
TYPE2  ptr[4];



乱说,aero 已经解释得很清楚了

论坛徽章:
0
9 [报告]
发表于 2006-05-27 00:10 |只看该作者
>> To yzcdf :


你第二条赋值搞错了。

int * (*ptr)[4] = &pt;     // 类型错误。

ptr 指向的是数组, 而不是指向指针。pt 是一个指针,不是数组。

所以:

一、你应该这样:
   
   int * (*ptr)[4] = pt;    // 或者: int * (*ptr)[4] = &a;

    你就可以这样提取数据:  (*ptr)[0];

    但即使这样,一样属于类型错误,ptr 所指向的数组元素类型为指针,无题不符合

二、如果你强行将
    int * (*ptr)[4] = & pt;     // 强行赋值为 pt 的地址。

   那么,你应该这样正确提取数据:
   
   (**ptr)[0];

[ 本帖最后由 mik 于 2006-5-27 00:20 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-05-27 12:58 |只看该作者
感谢大家的回复!

学习ing
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP