#include <iostream.h>
void main()
{
int a[2][3];
int (*p)[3]=a;
cout<<"p的占字节是:"<<sizeof(p)<<endl<<"a的占字节是:"<<sizeof(a)<<endl<<"*p的占字节是:"<<sizeof(*p)<<endl<<"a[0]的占字节是:"<<sizeof(a[0]);
}
输出结果是p占4,a占24,*p占12,a[0]占12,为什么输出的*p和a[0]占得字节数是一样,p占4个这个是数组做了隐式的转换,但是想不通*p和a[0]为什么会一样????????
分析:
int (*p)[3]表示p是一个指针变量,它指向包含3个整型元素的一位数组。*p有3个元素,每个元素为整型,即p是指向一位数组的指针。
当a是一个二位数组如a[n][m],a[0]其实代表的是一个一位数组名,它指向第0行的首的地址,a[1]代表第二行的首地址,一次类推。这与当a是一位数组时情况有点不一样。
当a是一个一位数组时,如a[n],a[0]代表第0个元素内容,这时就不是地址了,a[1]代表第二个元素内容,以此类推。
int (*p)[3]=a;这一句其实就是把a的第一行赋给p,则p指向a[0][0] , a[0][1] , 和 a[1][2] 三个元素。
所以:
p是一个指针,这个指针的类型是int类型,其实这里就是问这个指针类型所占字节数.(我用的是C-Free,int占4个字节)所以p所占4个字节
a代表一个2行3列的二维数组长度是6*4=24个字节
(*p)指a[0]这个一维数组长度,所以是3*4=12个字节
a[0]指这个二维数组的第一行的长度所以是3*4=12个字节
我改了下程序你看看输出就知道了:
#include <iostream.h>
void main()
{
int a[2][3];
for(int i = 0 ; i < 2 ; i ++ )
for(int j = 0 ; j < 3 ; j ++ )
a[i][j] = i + j ;
cout<<"cout the array of a "<<endl;
for(int i = 0 ; i < 2 ; i ++ )
{
for(int j = 0 ; j < 3 ; j ++ )
cout<<a[i][j] <<'\t' ;
cout<<endl;
}
cout<<endl;
int (*p)[3]=a;
cout<<"out the array of p "<<endl;
for(int i = 0 ; i < 3 ; i ++ )
cout<<(*p)[i]<<'\t' ;
cout<<endl<<endl;
cout<<"int 类型所占字节数"<<sizeof(int)<<endl;
cout<<"p的占字节是:"<<sizeof(p)<<endl
<<"a的占字节是:"<<sizeof(a)<<endl
<<"*p的占字节是:"<<sizeof(*p)<<endl
<<"a[0]的占字节是:"<<sizeof(a[0])<<endl;
}
这样输出的是:
cout the array of a
0 1 2
1 2 3
out the array of p
0 1 2
int 类型所占字节数4
p的占字节是:4
a的占字节是:24
*p的占字节是:12
a[0]的占字节是:12
请按任意键继续. . .
a是个二维数组,a[0]是数组的第一行,就相当于一个一位数组的首地址
*p也是一样,也是一个一维数组的首地址
sizeof在求这类数组首地址的时候都是求该数组所占用的空间大小,一个int占用4个字节,所以3个就是12
楼上的解释是错误的,你可以试试下面的这些代码来了解一下
换为double时,就不是上面所说的指针大小了
void main()
{
double a[2][3];
double (*p)[3]=a;
cout<<"p的占字节是:"<<sizeof(p)<<endl
<<"a的占字节是:"<<sizeof(a)<<endl
<<"*p的占字节是:"<<sizeof(*p)<<endl
<<"a[0]的占字节是:"<<sizeof(a[0])<<endl;
}
这个是说明a[0]也是数组指针
void main()
{
int a[2][3]={{0,1,2},{3,4,5}};
int *p=a[1];
for(int i=0;i<3;i++)
cout<<*(p+i)<<endl;
for(int i=0;i<3;i++)
cout<<a[1][i]<<endl;
}
a[0]里面放的是一个指针,*p虽然放的是一个数组,但是你sizeof之后检查的并不是数组,而是指针,所有指针的大小与sizeof(void *)相同。
参考代码:
#include <iostream>
int main(){
int a[10],*p=a;
std::cout<<"array size is:"<<sizeof(a)<<std::endl;
std::cout<<"piont size is:"<<sizeof(p)<<std::endl;
}
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息