大家好,我是新手,帮我看看这个问题出在那里?想了半天想不通!!!
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 编辑 ]