关于数组指针的迷惑?

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)打印出一个很小负整数?
数组指针该怎么理解?我的注释我问题吗?
...全文
107 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;

}

下载前必看:https://pan.quark.cn/s/a4b39357ea24 C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。 三种方法总结如下(GCC验证成功): 方法一:形参为二维数组并给定第二维长度 此方法是简单直观的方法,形参与实参一样,容易理解。 举例: #include void subfun(int n, char subargs[][5]) { int i; for (i = 0; i < n; i++) { printf("subargs[%d] = %s", i, subargs[i]); } } 在C/C++编程中,二维数组的处理是一个重要的概念,特别是在处理矩阵或表格数据时。 在函数调用中,二维数组的传递方式可以有多种,每种方式都有其适用场景和注意事项。 以下是对标题和描述中提及的三种方法的详细说明:### 方法一:形参为二维数组并给定第二维长度这种方法是最直观且易于理解的。 在函数声明中,形参被声明为一个二维数组,并且指定第二维的长度。 例如:```cvoid subfun(int n, char subargs[][5]) { // ...}```这里的`subargs`实际上是一个行指针数组,每个元素都是一个指向字符数组指针。 在调用时,实参是一个与形参匹配的二维数组,如`char args[][5]`。 ```cchar args[][5] = {"abc", "def", "ghi"};subfun(3, args);```函数内部可以通过`subargs[i]`访问每一行的数据。 ### 方法二:形参为指向数组的指...

65,209

社区成员

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

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