c语言中数组相邻元素地址相差为变量类型的字节大小,比如32位编译环境int 是4字节,char 是一字节,差值分别就会是4和1,原理是因为内存单元按字节分配地址,一个内存单元可以存一个字节.
代码演示
int c[4] = { 1,2,3,4};
printf("%p\n", &c[0]);
printf("%p\n", &c[1]);
printf("%p\n", &c[2]);
可以看到地址差值为4
char c[4] = { 1,2,3,4};
printf("%p\n", &c[0]);
printf("%p\n", &c[1]);
printf("%p\n", &c[2]);
可以看到地址差值为1
C语言的标准中规定了 加法与减法运算对于地址的操作和对于值的操作是不同的,
当一个加法运算,加号左边的操作数是一个指针,而右边的操作数是一个整数时,这个整数值先乘以指针类型的大小(sizeof(int)),然后再加到左边的数上。
比如int *p
(p+1)
此时1先乘4再加因为int类型为四字节
当同一个数组的两个成员的指针相减时,其差值为:地址值的差,再除以一个数组成员的size。这个结果代表了两个指针对应元素的下标之差
#include<stdio.h>
int main()
{
int c[4] = { 1,2,3,4};
printf("%p\n", &c[0]);
printf("%p\n", &c[1]);
printf("%p\n", &c[2]);
int b = &c[2] - &c[0];
printf("%d", b);
return;
}
运行结果
参考资料地址
C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?_a2806005024的专栏-CSDN博客_c语言数组地址相减