C语言指针的一些理解

Author Avatar
Patrick 3月 18, 2020

今天在 C 语言一个指针的问题上卡了很久……虽然平常不用 C 语言,但是还是记录一下,不能让时间白白的被浪费了。

指针加减偏移量

首先是指针加一个整数,加了之后偏移的字节数等于数据类型的字节数乘以整数的数值,例如:

1
2
3
4
5
6
7
int *a; // 假设 int 是四个字节,a 地址为 1000
a = a + 3 // 地址为 1000 + 3 * 4 = 1012

// 假设 SOMESTRUCT 结构体是 52 字节
// b 地址为 10000
SOMESTRUCT *b;
b += 44; // 地址为 10000 + 44 * 52 = 12288

非整数倍的偏移量

如果不想偏移数据类型的整数倍怎么办?很简单,用下标取地址,比如:

1
2
char *a;
&a[7]

不过要注意的是这种方法只适用于 char 型的指针,其他类型的还是不行。

文件流的偏移量

如果要取文件流的偏移量,那就使用 stdio.h 中的 fseekfread 方法。

fseek 会将文件流指针偏移指定大小,fread 则可以将文件流的数据读取到特定的指针之中。

1
2
3
4
5
6
7
8
9
FILE *fp;
unsigned char *p;

// 将 fp 指针置于文件开头的第十个字节
fseek(fp, 10, SEEK_SET);
// 将以下量的数据写入 p 指针中
// 每个元素大小为 100 字节,一共有一个元素
// 写成 fread(p, 1, 100, fp) 也是相同效果
fread(p, 100, 1, fp);

另外,ftell 可以让你知道给定文件流当前指针的位置,和 fseek 配合使用可以知道文件流的大小。

1
2
fseek(fp, 0, SEEK_END);
int len = ftell(fp);