我不明白 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的第六个元素。
我不太明白为什么我得到的地址与我期望的不同。
我尝试使用 -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的第六个元素。