C++新手关于指针的问题

luohui198891 2009-03-24 06:55:40
我最近练习的时候遇到这样一个问题
int a[3];
int* p;
p=a;
以上这段代码是对的,因为a是数组名,也是数组的首地址,是一个常量,它指向第一个元素,也就是a[0]的地址。

然后我把它搬到二维数组里
int a[3][3];
int** p;
p=a;
这样些编译器会报错error C2440: '=' : cannot convert from 'int [3][3]' to 'int ** '
我不知道为什么会错。
我的理解是这样的,二维数组名就是第一行,也就是a[0]的指针,而a[0]又是第一行第一列,a[0][0]的指针
那不就是指向指针的指针吗?
那我定义一个指向指针的指针,并将a赋给p,怎么会错了
我猜是我理解有误,但是又不知道错在哪里,请高手帮下忙
...全文
208 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻海轩辕 2012-08-21
  • 打赏
  • 举报
回复
2维数组 ,1维数组 都可以看做分配了内存的指针 不能赋给2级指针
cao_julians 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 15 楼 的回复:

引用 13 楼 的回复:
引用 8 楼 的回复:

我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的

a 的数据类型不是 int(*)[3] 而是int[3][3] ,a是一个……
[/Quote]
非也!
对一维数组int a[N]而言,代码中单独的a常常指代&a[0],而非完整数组。类推于二维及多维数组
lin51616780 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 13 楼 的回复:
引用 8 楼 的回复:

我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的

a 的数据类型不是 int(*)[3] 而是int[3][3] ,a是一个数组类型

两人说的不是一回事
8楼说……
[/Quote]
我倒是觉得a是任何场合都是 表示完整数组 int[3][3]数据类型
所以 a[1]是一个 int[3]类型 a[0][0]是一个int类型 &a是一个int(*)[3][3]类型
&a[1]是一个 int(*)[3]类型
没矛盾 不用在特意场合特殊化a
cao_julians 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 8 楼 的回复:

我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的

a 的数据类型不是 int(*)[3] 而是int[3][3] ,a是一个数组类型
[/Quote]
两人说的不是一回事
8楼说的是代码中的a,它的语义是与&a[0]相同的.在C中数组名的语义是&*[0],仅在个别场合表示完整数组,如sizeof(a),&a,...
13楼说的是数组a
lin51616780 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
q=a[0];//这个通过,说明a[0]是int*类型


[/Quote]
这样无法说明a[0]的类型是int*
a[0]的正确的类型是int[3] 进行赋值的时候有隐式数据类型转换
lin51616780 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的
[/Quote]
a 的数据类型不是 int(*)[3] 而是int[3][3] ,a是一个数组类型
cao_julians 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的
[/Quote]
=========================
已经上道了!
对二维数组而言:
a[0][0]是int类型的
&a[0][0](即a[0])是int *类型的,int *p1=&a[0][0];是指针类型相容的
&a[0](即a)是int(*)[3]类型的,int **p与之是指针类型不相容的
&a是???自己推断一下,很少用!

另一角度:
二级指针与变量的关系(有图更好)

int**p2------>int*somepointer------>int something
我想说明的是二级指针与对象之间一定要有一级指针(变量)的真实存在。而a不是!

因而问题的解决应该从一级指针着手
1.
int **p2----->int (*p1)[3]----->a;//p1是指向首行的指针,并提供了首行的元素个数。p1+i则指向第i行(从第0行开始计)。
缺点是“[3]”限制了指针的通用性、不灵活

2.
int *p1[3]={a,a+1,a+2};//p1的三个元素分别指向了数组的每一行
int **p2=p1;//p2指向p1的首行,p2+1指向。。。
缺点是要自己提供行列控制,复杂点

两个p1方法都是可用的,关键是一级指针变量(数组)的真正存在
记忆点,二级指针变量与二维数组间必须有一级指针!而且类型必须相容!

自己画图看看
NM275490806 2012-08-17
  • 打赏
  • 举报
回复
我觉得楼主应该看下c primer plus第五版的里面关于你这个说的很详细
luohui198891 2009-03-24
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
printf("Hello World!\n");
int a[3][3]={1,2,3,4,5,6,7,8,9};
int(*p)[3];
p=&a[0];//p是一个指向有三个整型元素的数组的指针
int* q;
q=a[0];//这个通过,说明a[0]是int*类型

//p=&a+1;
printf("%d\n",a+0);
printf("%d\n",a+1);
printf("%d\n",&a[0]+0);
printf("%d\n",&a[0]+1);
return 0;
}


在自己试过这段代码以后觉得有点明白了,但是还是需要整理一下
指针是c里一个很灵活的工具,掌握的好很有用
  • 打赏
  • 举报
回复
数组名还是不等同于指针的,楼主别混用。
luohui198891 2009-03-24
  • 打赏
  • 举报
回复
我知道关于这三个的值都是相同的,是指向同一块地址,但是他们的类型是不是不同?
比如a和&a[0]是int(*)[3]类型的
而&a[0][0],是int*类型的
lei_zhuyan 2009-03-24
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main()
{
int a[2][2] = {{1,2},{3,4}};
cout << a << endl;
cout << &a[0] << endl;
cout << &a[0][0] << endl;
system("pause");
return 0;
}


仔细想想问什么这3个结果是一样的。 你就会明白了、
sherrik 2009-03-24
  • 打赏
  • 举报
回复
C++本身并没有2维数组 是通过一维数组来实现的 所以跟指针的指针没啥关系
luohui198891 2009-03-24
  • 打赏
  • 举报
回复
其实对于这个我还是不能理解,可能是因为惯性思维吧
觉得一维这样理解,二维也可以

liqinghua1653 2009-03-24
  • 打赏
  • 举报
回复
up
aime99 2009-03-24
  • 打赏
  • 举报
回复
恩,《C专家编程》上说,“数组可以理解成指针这个概念不是递归的”,
也就是说C中的二维数组(其实是数组的数组)不能理解成指针的指针,
那么 int a[3][4]
可以赋值给一个 指向含有4个int的 一维数组 的指针
也就是int(*p)[4] = a,应该是这样
luohui198891 2009-03-24
  • 打赏
  • 举报
回复
那我一维数组的时候是不是把a理解为指针
而二维数组的时候数组名a是指向一个a[0]的指针,而a[0]不是也是一个指向一行一列的指针吗?

而且a[i][j]不是和*(*(a+i)+j)等价吗?
那a不是相当于指向指针的指针那么操作吗?
benhuang 2009-03-24
  • 打赏
  • 举报
回复
理解错误,只有数组保存的是指针,a才是指向指针的指针。。。

65,211

社区成员

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

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