访问已分配内存中的变量

Mic*_*bor 8 c pointers

假设我想为3个整数分配内存:

int *pn = malloc(3 * sizeof(*pn));
Run Code Online (Sandbox Code Playgroud)

现在为我们分配值:

pn[0] = 5550;
pn[1] = 11;
pn[2] = 70000;
Run Code Online (Sandbox Code Playgroud)

要访问第二个值我做:

pn[1]
Run Code Online (Sandbox Code Playgroud)

但[n]运算符只是*(a + n)的快捷方式.那么这意味着我在索引后访问第一个字节.但int是4个字节长,所以我不应该这样做

*(a+sizeof(*a)*n)
Run Code Online (Sandbox Code Playgroud)

代替?它是如何工作的?

Jur*_*obl 12

不,编译器会处理这个问题.指针算术中有一些特殊的规则,就是其中之一.

如果您真的只想将其递增一个字节,则必须将指针强制转换为指向一个字节长的类型的指针(例如char).


cre*_*hen 8

好问题,但C会自动将偏移量乘以指向类型的大小.换句话说,当您访问时

p[n]
Run Code Online (Sandbox Code Playgroud)

对于声明为的指针

T *p;
Run Code Online (Sandbox Code Playgroud)

您将p + (sizeof(T) * n)隐式访问该地址.