数组指针的步长问题

bandaoyu 2020-04-07 10:50:51
7. 数组指针的步长问题:

int a[5] = { 1,2,3,4,5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1)); // 2,5


int *ptr = (int *)(&a + 1); 这个有点看不懂,a是数组的地址,&a就是指向数组地址的指针,(&a + 1) 就是指针往前移动一个指针的长度,
int *ptr = (int *)(&a + 1); 所以ptr 就是指向指针的指针, ptr - 1 指向指针的指针退后一位,又回到a的首地址,那么 *(ptr - 1) 不应该是1吗?
...全文
293 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxwnice 2022-07-04
  • 打赏
  • 举报
回复
学习了
qq_40162781 2020-04-11
  • 打赏
  • 举报
回复 1
上面经过了int*的转换,-1变成了减一个int
qq_40162781 2020-04-11
  • 打赏
  • 举报
回复 1
数组名只有两种情况下的表达式不会转变成指针,一种是用使用sizeof还有一种就是使用&运算符,它会变成数组指针
月凉西厢 2020-04-07
  • 打赏
  • 举报
回复 1
引用 2 楼 bandaoyu 的回复:
[quote=引用 1 楼 月凉西厢 的回复:] 注意a的类型是int[5],a+1指向的是第二排元素(虽然它并不存在) int *ptr = (int *)(&a + 1);//2,5 int *ptr = &a[0] + 1; //2,1
错了吧,a+1 指向的是int[5]的第2个元素,刚好是2。(&a + 1) 指向的是第二排? (&a + 1)指向的是第二排的话,解释就合理了[/quote] 不行的话你可以调试看看你代码中ptr指向的值,应该是个很奇怪的值。。如果不报越界的话。。
bandaoyu 2020-04-07
  • 打赏
  • 举报
回复 1
引用 1 楼 月凉西厢 的回复:
注意a的类型是int[5],a+1指向的是第二排元素(虽然它并不存在) int *ptr = (int *)(&a + 1);//2,5 int *ptr = &a[0] + 1; //2,1
错了吧,a+1 指向的是int[5]的第2个元素,刚好是2。(&a + 1) 指向的是第二排? (&a + 1)指向的是第二排的话,解释就合理了
月凉西厢 2020-04-07
  • 打赏
  • 举报
回复 1
注意a的类型是int[5],a+1指向的是第二排元素(虽然它并不存在) int *ptr = (int *)(&a + 1);//2,5 int *ptr = &a[0] + 1; //2,1
Behard 2020-04-07
  • 打赏
  • 举报
回复 1
其实你可以 printf("%d, %d [%p] [%p] ", *(a + 1), *(ptr - 1), a, ptr); 看看什么结果就理解了
sdghchj 2020-04-07
  • 打赏
  • 举报
回复

int a[5] = { 1,2,3,4,5 }; // a相当于int* const类型,&a[0]是int*类型,&a是int(*)[5]类型即行指针,三者的值都是一样的。
void *p1 = a;
int *p2 = a;
int *p3 = &a[0];
int *p4 = (int*)&a;
int (*p5)[5] = &a;
long p6 = (long)a;
double *p7 = (double*) a;
char *p8 = (char*) (long*)(long)a;
指针是有类型的,指针的值即地址却谈不上什么类型,说白了就是一个无符号整数,你想怎么转都行,自己保证安全。 而++ --的操作就跟指针类型有关了。
  • 举报
回复
@sdghchj 不错
  • 举报
回复
@风吹不倒的、小草儿~~ 挺好
月凉西厢 2020-04-07
  • 打赏
  • 举报
回复
引用 5 楼 bandaoyu 的回复:
[quote=引用 4 楼 chxchxkkk 的回复:] &a 是数组的地址,+1,是指向这一行地址的下一个,也就是a[4]的下一个未知元素的地址,然后ptr-1,退出一个int长度,就指向了a[4]。 这里容易搞不清楚的就是 &a + 1 这个概念了。
嗯? 数组的地址不就是a吗? &a[0]是第一个单元的地址 &a[0] = a 不是吗?[/quote]
引用 5 楼 bandaoyu 的回复:
[quote=引用 4 楼 chxchxkkk 的回复:] &a 是数组的地址,+1,是指向这一行地址的下一个,也就是a[4]的下一个未知元素的地址,然后ptr-1,退出一个int长度,就指向了a[4]。 这里容易搞不清楚的就是 &a + 1 这个概念了。
嗯? 数组的地址不就是a吗? &a[0]是第一个单元的地址 &a[0] = a 不是吗?[/quote]地址确实是同一个啊,但类型不一样啊。楼上也说的不太全面,ptr-1指向a[4]的关键原因是ptr是由int[5]强转过来的,改变了数据类型,其步长是按int*算的。
「已注销」 2020-04-07
  • 打赏
  • 举报
回复
因为ptr的类型是int* 减1是以int为单位 而&a的类型是*int[5],+1是以5个int位单位
bandaoyu 2020-04-07
  • 打赏
  • 举报
回复
引用 4 楼 chxchxkkk 的回复:
&a 是数组的地址,+1,是指向这一行地址的下一个,也就是a[4]的下一个未知元素的地址,然后ptr-1,退出一个int长度,就指向了a[4]。 这里容易搞不清楚的就是 &a + 1 这个概念了。
嗯? 数组的地址不就是a吗? &a[0]是第一个单元的地址 &a[0] = a 不是吗?
chxchxkkk 2020-04-07
  • 打赏
  • 举报
回复
&a 是数组的地址,+1,是指向这一行地址的下一个,也就是a[4]的下一个未知元素的地址,然后ptr-1,退出一个int长度,就指向了a[4]。 这里容易搞不清楚的就是 &a + 1 这个概念了。

64,683

社区成员

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

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