关于数组指针的迷惑?

Microsues 2010-12-22 06:31:41
先看代码?
	
#include<iostream>
using namespace std;

void main()
{

int(*p2)[10]; //数组指针,p2指向一个长度为10的数组,数组里的元素类型为int
int a[10] = {0,1,2,3,4,5,6,7,8,9};
p2 = &a;
cout<<p2<<endl;
cout<<*p2<<endl;
cout<<**p2<<endl;
cout<<**(p2+1)<<endl;

}

为什么p2和*p2打印出相同的地址?**p2才打印出0?**(p2+1)打印出一个很小负整数?
数组指针该怎么理解?我的注释我问题吗?
...全文
88 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
houzhenghui123 2010-12-22
  • 打赏
  • 举报
回复
谭浩强的书,在讲那个士兵站队的例子,写的很好,当初我就是用哪个例子,来明白这个问题的,希望对你有用!
無_1024 2010-12-22
  • 打赏
  • 举报
回复
你的第一个声明好比一个二维数组
但是你只有用到第一维 和没用是一样的所以地址相同
至于最后一个数字是随机的根据电脑决定
在我这里就是1245012
zanglengyu 2010-12-22
  • 打赏
  • 举报
回复
其实*p 与p打印相同地址 只能说明 p与*p都指向 第一个元素的地址 只能这么理解 我也解释不清为什么
Microsues 2010-12-22
  • 打赏
  • 举报
回复
int (a*)[10];//a是二维数组??
int (*a)[10];//a也是二维数组??
[Quote=引用 1 楼 chlaws 的回复:]

C/C++ code

#include<iostream>
using namespace std;

void main()
{

int(*p2)[10]; //数组指针,p2指向一个长度为10的数组,数组里的元素类型为int
int a[10] = {0,1,2,3,4,5,6,7,8,9};
p2 = &a; //p2类型是int(*)[10];和二维……
[/Quote]
zanglengyu 2010-12-22
  • 打赏
  • 举报
回复
你这样写出来的东西

最终a是这样一个数组
第一行
有十个元素
这是个元素中 第一个元素为0
且此地址是 *p 和p指向的地址
*p指向(*p)[10]中的第一个地址就是*p[0]
p指向a[0] 根据你的定义 p=&a;
这就说明 这一行的第一个元素为0;就是**p=0;
*(p+1) 指向(*p)[1]的地址
**(p+1)=(*p)[1]
但是这里只是地址没初始化
所以输出的数值是不确定的
第二行
第一个元素就是
*(*p+1)=1
zanglengyu 2010-12-22
  • 打赏
  • 举报
回复
你这样写出来的东西

最终a是这样一个数组
第一行
有十个元素
这是个元素中 第一个元素为0
且此地址是 *p 和p指向的地址
*p指向(*p)[10]中的第一个地址就是*p[0]
p指向a[0] 根据你的定义 p=&a;
这就说明 这一行的第一个元素为0;就是**p=0;
*(p+1) 指向(*p)[1]的地址
**(p+1)=(*p)[1]
但是这里只是地址没初始化
所以输出的数值是不确定的
第二行
第一个元素就是
*(*p+1)=1
就想叫yoko 2010-12-22
  • 打赏
  • 举报
回复
你首先要理解
int arr[10] = {0};
std::cout << arr << ',' << &arr << std::endl;
这样打出来的地址其实是一样的
arr会退化成指向数组首地址的指针
但是arr+1和&arr+1就不一样了
arr+1指向的是下标为0的数组元素的值
&arr+1指向的是下标为10(越界了)的数组元素的值
matrixcl 2010-12-22
  • 打赏
  • 举报
回复
你的注释没错

为什么p2和*p2打印出相同的地址? 这个我也回答不了


**p2才打印出0? *p2 等价于a **p2 等价于*a等价于a[0]


**(p2+1)打印出一个很小负整数? p2=&a p2+1=&a+sizeof(a) 所以**(p2+1)就等于a[10]了(越界读了,数据不定)
joyeewen 2010-12-22
  • 打赏
  • 举报
回复
P2是一个二级指针。“**p2才打印出0”,因为*p2是指向第一个元素。如果你用*(*P2+1)就不是那个负数了,而是1。至于为什么P2和*P2打印出同样的地址,*p2是p2的内容,p2的内容也是个地址嘛。
chlaws 2010-12-22
  • 打赏
  • 举报
回复
建议你看下<<C和指针>>这本书,该书中对指针和数组的区别讲的挺详细的
chlaws 2010-12-22
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

void main()
{

int(*p2)[10]; //数组指针,p2指向一个长度为10的数组,数组里的元素类型为int
int a[10] = {0,1,2,3,4,5,6,7,8,9};
p2 = &a; //p2类型是int(*)[10];和二维数组是一样的事
//p2相当于数组的首地址,p2+1,相当于移动二维数组中的下一行
cout<<p2<<endl;
//*p2相当于数组的第一个元素的地址,而这和数组的首地址当然是一样的
cout<<*p2<<endl;
//相当于取数组a中的第一个元素的值
cout<<**p2<<endl;
//这里改成这样,*p2+1,才是让指针在指向a这行中移动到下一个元素
cout<<*(*p2+1)<<endl;

}

64,676

社区成员

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

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