You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

(pointer + n)与pointer[n]的区别及指针代码用法疑问

pointer + n 与 pointer[n] 的本质区别及代码用法解析

核心区别

  • pointer + n 是指针运算:结果是一个指针,指向原指针pointer向后偏移n个元素的内存地址。偏移的字节数会自动匹配指针类型(比如char*偏移n*1字节,int*偏移n*4字节)。
  • pointer[n] 是数组下标访问:这是C语言的语法糖,本质等价于*(pointer + n),结果是对应内存地址上存储的具体数据值,而非地址本身。

结合你的代码分析

为什么用 ptr + i 存值(scanf部分)

scanf(" %c", ptr + i); 中,scanf要求第二个参数传入变量的内存地址,才能把输入的字符写入对应位置。ptr + i正好是第i个字符的内存地址,完全符合要求。你也可以写成&ptr[i],因为&ptr[i]等价于&*(ptr + i),最终和ptr + i指向同一个地址。

为什么用 ptr[i] 取值(printf部分)

printf("%c ", ptr[i]); 中,%c格式符需要传入字符类型的数值,ptr[i]直接就是该地址存储的字符值。如果强行用ptr + i,它是一个指针地址,printf会把地址数值当成ASCII码输出,结果完全错误。如果想用指针写法输出,应该写成*(ptr + i),这和ptr[i]完全等价。

代码里的一个小问题

你第一个循环里的printf存在错误:

printf ("Enter ptr[%d] (%p) (%p): ", i, ptr[i], ptr + i);

这里ptr[i]是char类型的值,却用%p(打印指针地址的格式符)输出,会导致未定义行为。应该改成%c(打印字符)或者%d(打印ASCII码),比如:

printf ("Enter ptr[%d] (%c) (%p): ", i, ptr[i], ptr + i);

总结

代码里的写法只是不同语法的合理选择,并非必须这么做:

  • 存值时,ptr + i 和 &ptr[i] 完全等价
  • 取值时,ptr[i] 和 *(ptr + i) 完全等价
    选择哪种写法更多是代码风格的问题,核心逻辑完全一致。

内容的提问来源于stack exchange,提问作者TAJ-32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:16:10