我不懂C指针

时间:2019-08-20 16:07:14

标签: c pointers pointer-arithmetic

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

我尝试使用-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)不同?

1 个答案:

答案 0 :(得分:1)

这两个值之间的差异

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数组的第六个元素。