【发布时间】:2015-02-19 06:19:27
【问题描述】:
我正在学习 C 中的指针。我对指针算术感到困惑。看看下面的程序:
#include<stdio.h>
int main()
{
int a[] = 2,3,4,5,6;
int *i=a;
printf("value of i = %d\n", i); ( *just for the sake of simplicity I have use %d* )
printf("value of i+2 = %d\n", i+2);
return 0;
}
我的问题是如果 i 的值是 653000 那么为什么 i+2 的值是 653008据我所知,内存中的每一位都有指定的地址,那么根据 i+2 的值应该是 653064 因为 1 字节 = 8 位。为什么指针算术用字节缩放,为什么不用位? 提前感谢,对不起我的英语不好!
【问题讨论】:
-
i+1 指向下一个元素。编译器知道 i 指向一个整数,大小为 4 个字节。为了获取下一个字节的地址,将 i 转换为一个字节*
-
"just for the sake of simplicity I have use %d"。 No. 指针以十六进制显示,带有"%p"格式说明符。 -
@JonathonReinhart:我认为,为了简单,可以使用 %d
-
@alzaimar 没有。没有额外的简单性。如果一个人不能理解十六进制表示法,那么就不应该使用指针。更不用说,如果启用并注意编译器警告(例如
gcc -Wall),当printf期待一个整数时,你会立即意识到你正在传递一个指针 >,可能是不同的大小。 -
@alzaimar 这就是为什么我在 comment 中提到它,而不是答案。您正在分散实用建议的注意力。
标签: c pointers memory-address pointer-arithmetic