比如int a[2][3],为什么不能用*a来输出a[0][0]?
如图片中的问题
附:#include<stdio.h>
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
printf("%d\n",&a[0]); //268712
printf("%d\n",&a[0][0]); //268712
printf("%d\n",a); //2686712 一个地址 (都采用%d表示,方便观察。)
printf("%d\n",*a); //2686712 一个地址?
//a不是代表第一行的首地址么?所以也可以说是第一行第一个元素的地址吧,
//上面的输出同样验证的确是这样,那为什么*a无法输出具体元素值呢?还是一个地址值?
printf("%d\n",*a[0]); //输出1 ,这样肯定是可以输出的(由上面知道&a[0][0]和a等价,
//那么为什么a[0][0]可以输出数据值,而*a不可以?当然**a肯定可以。)
char m[2][3]={"ab","cd"};
printf("%s\n",m);//ab
printf("%s\n",*m);//ab
}
数组 c语言 指针 地址
[解决办法]
当a是二维数组名时,a即&a[0],而*a即a[0],两者的显式的值是相同的,但是基类型是不同的。
如果定义int a[2][3];
a类型是 int (*)[3]
*a类型是 int *
这二者,显式的只都是相同的,但是意义不同
[解决办法]
#include<stdio.h>
#include "windows.h"
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
printf("%d",sizeof(*a)); //输出12 ,*a的类型是int[3],大小当然是12了
printf("%d",sizeof(a[0][0])); //输出4,a[0][0]的类型是int,大小就是4了
system("pause");
}
当a是二维数组名时,a即&a[0],而*a即a[0],两者的显式的值是相同的,但是基类型是不同的。
如果定义int a[2][3];
a类型是 int (*)[3]
*a类型是 int *
这二者,显式的只都是相同的,但是意义不同
如上所述 *a的类型严格来说应该是int[3] ,a[0][0]类型是int
C/C++是强类型语言,时刻要有“类型”的观念呀
#include<stdio.h>
#include "windows.h"
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
printf("%d",sizeof(*a)); //输出12 ,*a的类型是int[3],大小当然是12了
printf("%d",sizeof(a[0][0])); //输出4,a[0][0]的类型是int,大小就是4了
system("pause");
}
谢谢,明白了许多。
当a是二维数组名时,a即&a[0],而*a即a[0],两者的显式的值是相同的,但是基类型是不同的。
如果定义int a[2][3];
a类型是 int (*)[3]
*a类型是 int *
这二者,显式的只都是相同的,但是意义不同