永发信息网

再问一个c++的指针问题

答案:4  悬赏:0  手机版
解决时间 2021-07-26 18:29
  • 提问者网友:我一贱你就笑
  • 2021-07-25 18:13

#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]为什么会一样????????

最佳答案
  • 五星知识达人网友:酒安江南
  • 2021-07-25 18:19
int (*p)[3] 你可能不太明白这个定义的含义 这个定义的含义是p是一个指向 有3个元素数组 的指针
首先p是一个指向有3个元素数组的指针
因为是指针 所以占1个机器字长 vc下是4
a是一段连续的静态数据里面有2*3=6个int 一个intvc下占4个字节 因此是24
*p指向了a 又因为是指向3个元素数组的指针 所以等同于a[0] a[0]中有3个int 3*4=12
全部回答
  • 1楼网友:未来江山和你
  • 2021-07-25 22:35

分析:

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 请按任意键继续. . .

  • 2楼网友:傲气稳了全场
  • 2021-07-25 21:20

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; }

  • 3楼网友:迷人又混蛋
  • 2021-07-25 19:50
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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯