C 指针增量是如何工作的?

C 指针增量是如何工作的?,c,pointers,C,Pointers,我们有一个数组:intp[100] 为什么p[i]等同于*(p+i)而不是*(p+i*sizeof(int)) 为什么p[i]等同于*(p+i),而不是*(p+i*sizeof(int)) 因为*(p+i)也与*((int*)((char*)p+i*sizeof(int))相同。将整数i添加到指针时,指针将移动i乘以所指对象的大小 为什么p[i]等同于*(p+i),而不是*(p+i*sizeof(int)) 因为*(p+i)也与*((int*)((char*)p+i*sizeof(int))相同

我们有一个数组:
intp[100]

为什么
p[i]
等同于
*(p+i)
而不是
*(p+i*sizeof(int))

为什么p[i]等同于
*(p+i)
,而不是
*(p+i*sizeof(int))

因为
*(p+i)
也与
*((int*)((char*)p+i*sizeof(int))相同。将整数
i
添加到指针时,指针将移动
i
乘以所指对象的大小

为什么p[i]等同于
*(p+i)
,而不是
*(p+i*sizeof(int))


因为
*(p+i)
也与
*((int*)((char*)p+i*sizeof(int))相同。将整数
i
添加到指针时,指针将移动
i
倍于所指对象的大小。

数组元素将连续存储

*(p+i)
这里p的基址为数组p,i的范围为0到99


因此,可以通过增加i来迭代p的元素。

数组元素是连续存储的

*(p+i)
这里p的基址为数组p,i的范围为0到99


因此,您可以通过增加i来迭代p的元素。

这是因为在将
i
添加到
p
之前,编译器在内部计算
p
指向的数据类型的大小,然后将其
i
次添加到
p

,这是因为在将
i
添加到
p
编译器之前在内部计算数据类型
p
指向的大小,然后将其
i
次添加到
p

为什么p[i]等同于
*(p+i)
,而不是
*(p+i*sizeof(int))

这是因为指针算术的工作方式:将整数
n
添加到指针会产生一个指针,从第一个开始(基于0)指向
n
th元素(不是字节)

为什么p[i]等同于
*(p+i)
,而不是
*(p+i*sizeof(int))

这是因为指针算术的工作方式:将整数
n
添加到指针会产生一个指针,从第一个开始(基于0)指向
n
th元素(不是字节)

为什么p[i]等价于*(p+i)而不是*(p+i*sizeof(int))

因为某些处理器架构无法取消对不指向按其类型大小对齐的地址的指针的引用。这基本上意味着指向 4字节整数应始终指向4的倍数

当程序试图取消对未对齐指针的引用时,可能会导致“总线错误”。你可以阅读更多关于它的内容

您要求的是
p+1
应该将指针增加一个字节,而不是一个元素。如果语言是这样设计的,那么编写
p++
将不再适用于
char
以外的其他类型的指针。当程序员忘记编写
*sizeof(*p)
进行添加时,也会导致指针对齐出现大问题

这可能会让人困惑,但有非常充分的理由解释为什么语言是这样设计的

为什么p[i]等价于*(p+i)而不是*(p+i*sizeof(int))

因为某些处理器架构无法取消对不指向按其类型大小对齐的地址的指针的引用。这基本上意味着指向 4字节整数应始终指向4的倍数

当程序试图取消对未对齐指针的引用时,可能会导致“总线错误”。你可以阅读更多关于它的内容

您要求的是
p+1
应该将指针增加一个字节,而不是一个元素。如果语言是这样设计的,那么编写
p++
将不再适用于
char
以外的其他类型的指针。当程序员忘记编写
*sizeof(*p)
进行添加时,也会导致指针对齐出现大问题

这可能会让人困惑,但有非常充分的理由解释为什么语言是这样设计的