指针的步长可以理解为指针变量+1时指针变量移动了多少个字节。

看下代码

1
2
3
4
5
int *p = NULL; 
printf("%p\n", p); // 0x0
printf("%p\n", p+1); // 0x4
printf("%p\n", p+2); // 0x8
printf("%p\n", p+3); // 0xc

对指针变量p+1,指针变量保存的内存地址值+4,也就是说指针变量p每次+1移动4个字节。

通过其它类型输出会发现步长是由指针的类型类决定的。指针类型不仅影响步长,还决定通过每次通过指针读取指向内存空间字节数。

1
2
3
char buff[4] = {1, 3, 5, 6};
char *p = buff;
printf("%d\n", *p); // 1

通过*p访问内存空间数据,首先根据指针变量p的内存地址找到对应的内存单元,再根据指针变量的类型为int,读取四个字节。

下面我们看一个复杂的示例 运用上面知识点通过指针访问结构体成员的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import <stdio.h>
#include <stddef.h>

// 定义结构体类型Person
struct Person {
int age;
double height;
};

int main() {

struct Person person = {12, 1.89};
struct Person *p = &person;

// 获取Person结构的height成员
char *cp = (char *)p;
// offsetof函数计算出height成员在结构体Person便宜字节数
int offset = offsetof(struct Person, height);
printf("%f", *(double *)(cp+offset)); // 1.89

return 0;
}