我不明白 C 指针

I don't understand C pointers

我不太明白为什么我得到的地址与我期望的不同。

我尝试使用 -m32 标志选项构建这个小的 C 代码。

#include <stdio.h>
#include <stdlib.h>

char *Buffer[10];

int main (void){
 printf("%p\n", Buffer);
 char *Buffer2 = Buffer + 6;
 printf("%p\n", Buffer2);
}

预期输出:

Buffer = 0x56559040
Buffer2 = 0x56559046

获得的输出:

Buffer = 0x56559040
Buffer2 = 0x56559058

为什么得到的输出与预期的不同(0x56559040 + 6 = 0x56559046)?

这两个值的区别

Buffer = 0x56559040
Buffer2 = 0x56559058

0x18 或十进制 24.

在此声明中

char *Buffer2 = Buffer + 6;

数组指示符 Buffer 被转换为指向其第一个元素的指针。由于数组 Buffer 的元素类型为 char *,因此表达式的类型为 char **.

类型char *(变量的类型Buffer2)和char **(初始化器的类型)

之间没有隐式转换

所以编译器至少应该发出一个警告。

不过这个表达式使用指针算法

Buffer + 6

被评估为

the value of the address pointed to by Buffer + 6 * sizeof( char * )

因为您系统中 char * 类型的指针的大小(数组元素的大小)等于 4 那么您得到值 0x56559058 即

0x56559040 + 6 * sizeof( char * )
                 ^^^^^^^^^^^^^^^^
                       4

就是这个表达式

Buffer + 6

指向数组Buffer的第六个元素。