(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
相关产品推荐
相关产品推荐

