指向指针的指针(二级指针)和二维数组名到底有什么关系!

papaofdoudou
人工智能领域新星创作者
博客专家认证
2009-05-10 07:41:16
一般说来 int a[10][10],a的类型不是int **, 而是int(*)[10], a[0]的类型为int *,当取某一个变量的时候,采用int a[x][y] 的形式。
而对於int**p 二级指针来说,它与a的类型截然不同,数组名a中的地址值==二维数组中一维子数组的地址==a[0][0]的地址,也就是说int(a)==int(a[0])==int(&a[0][0]),而p是指针的指针,按理说不同类型的变量使用形式应该有些差别的,但是看下面的代码:
int**p;
int n,m;
cin>>n;
cin>>m;
p=new int*[n];

for(int i=0;i<n;i++)
{
p[i]=new int [m];
}

for(int j=0;j<n;j++)
for(int k=0;k<m;k++
{
p[j][k]=j+k;
}
for(int l=0;l<n;l++)
{
delete []p[i]
}
delete []p;

对p的访问方式和二维数组一摸一样,我就想知道,到底什么机制造成了这样的结果呢??明明p为int**类型,而a为int(*)[10],但是访问的时候p仍然被当做一个二维数组名字一样的量来访问内部元素,从指针的角度一一分析我知道原因,但是毕竟是两类不同性质的量,在共同的形式外表下,究竟它们的内部访问机制有什么不同呢???
...全文
1738 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vnking 2010-07-05
  • 打赏
  • 举报
回复
面对难题,低头路过~~
lijiao7073 2009-06-10
  • 打赏
  • 举报
回复
第一链接里,说得是 数组名可以当作指针常量使用

第二个链接里,说得是 怎样分配一段内存用于存放多维数组

依然没有解决: 楼主的疑问,为什么指针可以当作数组名使用???


疑惑。。。。
BuleRiver 2009-05-10
  • 打赏
  • 举报
回复
二维数组名是一块内存的名字,它的大小就是这块内存,而指向指针的指针事实上就是存放了数据的地址,而这个数据还是个地址,其大小在32位机上是4个字节。
fairchild811 2009-05-10
  • 打赏
  • 举报
回复
int(a)==int(a[0])==int(&a[0][0]),这个是对的,但是不能混用,因为表示的意义不一样,只是他们指向同一个地方
zhangjundriver 2009-05-10
  • 打赏
  • 举报
回复
C陷阱与缺陷 里面把指针和数组讲得很清楚。其实指针和数组名是没有多大的区别的。
hw324306893 2009-05-10
  • 打赏
  • 举报
回复
int **p 是指向指针的指针,*p的值为一个地址
p = new int*[n];可以理解为创建创建n个指向int类型的指针,分别是p[0],...,p[n-1]
而for(int i=0;i <n;i++)
{
p[i]=new int [m];
}
对各个指针初始化,即给p[0],...,p[n-1]赋值

正如char *p = new char[5];
你还不是可以p[i]的形式访问元素。
Cpp权哥 2009-05-10
  • 打赏
  • 举报
回复
二维数组名可以看成是指向一维数组的指针。因为一维数组和指针都支持[],所以才有人混淆它们。二维数组名加一对[]的结果是一维数组,二级指针加一对[]的结果是一级指针,所以它们都可以再加一次[]。
really3353 2009-05-10
  • 打赏
  • 举报
回复
我想:指向变量的指针存储的是变量的地址,那么:指向指针的指针存储的是指针的地址。
lingyin55 2009-05-10
  • 打赏
  • 举报
回复

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧