| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 622 人关注过本帖
标题:大家好,我是新手,帮我看看这个问题出在那里?想了半天想不通!!!
只看楼主 加入收藏
fcwr_520
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-2-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:15 
大家好,我是新手,帮我看看这个问题出在那里?想了半天想不通!!!
  1 #include<stdio.h>
  2 int main()
  3 {
  4     int num[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  5     int *p;
  6     printf("num   =%p\n",num);
  7     printf("num[0]=%p\n",num[0]);
  8     printf("num   =%d\n",sizeof(num));
  9     printf("num[0]=%d\n",sizeof(num[0]));

 10     for(p=num;p<num+12;p++) {
 11         if ((p-num)%4==0) printf("\n");
 12         printf("%3d",*p);}
 13     printf("\n");
 14     return 0;
 15 }
编译时  提示错误  x.c:9:9: 错误:双目运算符 - 操作数(‘int *’和‘int (*)[4]’)无效

但是当把for循环里的num改成num[0]时,却编译通过!为什么num和num[0]两个的地址一样,但是num就不行了?
请高手指出问题出在了哪里!!!


  1 #include<stdio.h>
  2 int main()
  3 {
  4     int num[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  5     int *p;
  6     printf("num   =%p\n",num);
  7     printf("num[0]=%p\n",num[0]);
  8     printf("num   =%d\n",sizeof(num));
  9     printf("num[0]=%d\n",sizeof(num[0]));

 10     for(p=num[0];p<num[0]+12;p++) {
 11         if ((p-num[0])%4==0) printf("\n");
 12         printf("%3d",*p);}
 13     printf("\n");
 14     return 0;
 15 }
把for循环里的num改成num[0]时,就能编译通过了!
这里我用sizeof看了下num和num[0]的大小,num是48,num[0]是16,说明num指的是二维数组的大小,
而num[0]指的是二维数组里一维数组的大小,错误提示p的类型是'int *',而num的类型是'int (*)[4]',
说明num是一个指针,指向的是有4个整型元素的一维数组!


这时我就有疑问了,num,num[0],num[0][0]有啥区别呢?
num 是一个二维数组;
num[0] 是二维数组里的一个一维数组;
num[0][0] 是二维数组里的第一个数组的第一个元素!

其实这里再用个指针变量p2附初值为num的地址,for循环里的num换成p2也可以通过了,因为这时p和p2的类型都为'int *'了!!!



请大家给我推荐本介绍计算机原理方面的书给我看看!!!


[ 本帖最后由 fcwr_520 于 2013-2-6 20:00 编辑 ]
搜索更多相关主题的帖子: include return 
2013-02-06 19:07
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:3 
因为取余运算的要求是%两边都是整型变量,p-num[]在运算时会转换成整型,所以可以编译通过,p-num是地址,是16进制的。纯属个人理解,楼主参考下。
2013-02-06 19:16
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
别忘了,给分啊,嘿嘿。
2013-02-06 19:16
fcwr_520
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-2-6
收藏
得分:0 
回复 2楼 幽灵X
敢问为什么p-num[]在运算时会转换成整型呢,难道gcc编译器就这么规定了???
2013-02-06 19:25
fcwr_520
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-2-6
收藏
得分:0 
回复 3楼 幽灵X
请问有什么书是介绍gcc编译器这些规则的呢???
2013-02-06 19:26
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:3 
类型不统一吧,
p 是 int*
num 是 int**


莫问前尘有愧,但求今生无悔
2013-02-06 19:33
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
呃....或许我错了。
2013-02-06 19:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
以下是引用fcwr_520在2013-2-6 19:26:20的发言:

请问有什么书是介绍gcc编译器这些规则的呢???

gcc和其他编译器一样 非说不同就是 gcc对一些东西要求更严格 对规范的实现程度比较好

非要看规则么 看C99规范一类的东西更好
2013-02-06 19:38
Johnsonzhen
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2013-1-19
收藏
得分:3 
一重指针,指向一维数组!
2013-02-06 19:41
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
我刚才在vc6.0上测试,p-num[0]输出确实是个整数12,p-num输出是c,正好是12的16进制
2013-02-06 19:46
快速回复:大家好,我是新手,帮我看看这个问题出在那里?想了半天想不通!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.072678 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved