指针问题,*(A+B)怎么看呢

aswqzabc 2011-09-29 09:48:54
int b[5]={0,100,200,300,400};
const int *a=b;
cout<<"输出数组"<<endl;
for(int nindex=0;nindex<5;++nindex)
cout<<"["<<nindex<<"]"<<*(a+nindex)<<endl;
输出分别是数组B和各个值,这是在书上说的例子,就是一直搞不清楚那个*a是怎么回事,*(a+nindex)这个怎么看呢
...全文
152 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 namelij 的回复:]
指针加减本身就是错误
更别说取地址,即使你的代码能够编译成功,运行也会错误
[/Quote]

同学你写多了一个字。
指针相加,错。
指针相减,可以。
善良超锅锅 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jacicson1987 的回复:]
真心表示。。。先把老谭的书看一遍,这些都不是问题啦。。

int *a = b ;
等价于
int *a;
a = b; / b是数组名,即 b为数组首地址。 此把首地址赋给指针a 。

指针a指向首地址 , 那么+ n ,就是第 n+1个元素的地址, 解引用 * (a+n),就是第n+1个元素,也就是b[n];
[/Quote]
++1
hwzcjxhl 2011-09-29
  • 打赏
  • 举报
回复
写错了,a就是该值代表的地址
hwzcjxhl 2011-09-29
  • 打赏
  • 举报
回复
如果我没记错的话,指针指的是指向某一地址的值,*a代表值,a好像就是指针
_了凡_ 2011-09-29
  • 打赏
  • 举报
回复
C系语言指针就是“灵魂”,灵活得很,但也很容易出错,所以,so,java就将其
从语言层面禁止了。
对于楼主的问题,*(b+1)确实是和b[1]是相同的,执行的都是同一个值。但楼主
要知道sizeof(b)的值和sizeof(a)的值是不同的:

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
int b[5] = {1, 2, 3, 4, 5};
const int *a = b;

cout << "b's address is: " << b << endl;
cout << "a's address is: " << a << endl;
cout << "(b + 1)'s address is: " << (b + 1) << endl;
cout << "(a + 1)'s address is: " << (a + 1) << endl;
cout << "sizeof(b) = " << sizeof(b) << endl;
cout << "sizeof(a) = " << sizeof(a) << endl; // 我的是64位系统
return 0;
}

Output:
b's address is: 0x7fff67119790
a's address is: 0x7fff67119790
(b + 1)'s address is: 0x7fff67119794
(a + 1)'s address is: 0x7fff67119794
sizeof(b) = 20
sizeof(a) = 8
天人新才 2011-09-29
  • 打赏
  • 举报
回复
a是指针类型变量,其值为数组的物理首地址
物理地址也是数自然可以与nindex相加
由于数组的存储空间的物理地址是连续的
所以*(a+nindex)等价于b[nindex]
  • 打赏
  • 举报
回复
指针加减本身就是错误
更别说取地址,即使你的代码能够编译成功,运行也会错误
Kevin_Perkins 2011-09-29
  • 打赏
  • 举报
回复
int* a = b;
这么看就明白了吧?a是一个指向整形变量的指针,指向了数组b的第一个整数。
a + index是指针运算,从a指向的地址开始,向后移动index个a所指类型占用的地址单元。
*(a + index),取出该地址所存的整数。
LZS535261548 2011-09-29
  • 打赏
  • 举报
回复
数组与指针的关系 区别联系 应该好好看看
小湿哥 2011-09-29
  • 打赏
  • 举报
回复
真心表示。。。先把老谭的书看一遍,这些都不是问题啦。。

int *a = b ;
等价于
int *a;
a = b; / b是数组名,即 b为数组首地址。 此把首地址赋给指针a 。

指针a指向首地址 , 那么+ n ,就是第 n+1个元素的地址, 解引用 * (a+n),就是第n+1个元素,也就是b[n];
iamnobody 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aswqzabc 的回复:]
小弟不才啊,那个*(a+nindex)相当于 a[nindex]怎么理解,a不是物理地址么,nindex是常量啊,这个能相加么,
[/Quote]

能, a + 1 表示 a 指向的位置的下 1 个位置。 a + n 表示从 a 的下一个数起,第n个位置。
指针只能和整形相加。指针不能和指针相加。
adventurelw 2011-09-29
  • 打赏
  • 举报
回复
指针可以做加法,但一定不能是指针+指针,是指针+偏移量,一单位的偏移量就是指针所代表类型的字节大小
AndyZhang 2011-09-29
  • 打赏
  • 举报
回复
就和直接取数组指定下标是一个意思,*就是取地址里面的内容
CenDor 2011-09-29
  • 打赏
  • 举报
回复
你的程序里的a之指向数组的指针 开始时指向数组第一个元素,也就是0,a+nindex指的是指针向后移动nindex个元素,依次指向100、200、300、400,而*指的是取该指针所对应的地址单元所存储的数据的内容,就是求a+nindex所指向的地址单元存储的内容,也就是0、100、200、300、400。

希望这个答案楼主能满意
cao_julians 2011-09-29
  • 打赏
  • 举报
回复
const int *a=b;
这一语句要分两部分理解"
const int *a
a 是指向int类型变量的指针变量
a=b
用b数组首元素的地址(即&b[0])初始化a,令a指向b[0]
==========================
*(a+nindex)
(a+nindex) 即&b[0]+nindex为&b[nindex](下标为nindex的数组元素地址)
*(a+nindex),即*(&b[nindex])即b[nindex] 的值
aswqzabc 2011-09-29
  • 打赏
  • 举报
回复
小弟不才啊,那个*(a+nindex)相当于 a[nindex]怎么理解,a不是物理地址么,nindex是常量啊,这个能相加么,
iamnobody 2011-09-29
  • 打赏
  • 举报
回复
const int *a = b;
表示将数组b的首地址给a;
*(a+nindex)相当于 a[nindex];也就是 b[nindex];
就是取第 nindex + 1 个元素。
a + nindex 是一个指针与一个整数相加,表示指向a指针向后nindex的位置
aswqzabc 2011-09-29
  • 打赏
  • 举报
回复
帮忙啊,兄弟们,该你们大显身手的时候了,呵呵,

65,206

社区成员

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

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