方括号如何在C中起作用?

oor*_*rst 1 c arrays malloc pointers

我刚开始使用C而且我正在尝试理解基础知识.大量的教程会告诉你一些事情并让你相信它没有任何真正的解释,并且没有任何答案,我发现它是人类可读的.

在下面的:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int *a;

  a = malloc(5 * sizeof(int));

  a[2] = 4;

  printf("%d\n", a[0]); // Prints 0
  printf("%d\n", a[2]); // Prints 4

  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我没有显式声明int *a为数组的指针,但如果我分配一些内存,我可以使用,a就像我已经将它声明为一个数组.声明带方括号的指针只是我在下面所做的快捷方式吗?方括号实际上做了一些指针运算吗?

厚脸皮第二个问题

为什么内存地址分配给a*a

Ama*_*dan 7

我没有显式声明int *a为数组的指针,但如果我分配一些内存,我可以使用,a就像我已经将它声明为一个数组.声明带方括号的指针只是我在下面所做的快捷方式吗?

相似,但没有.int *a声明a为指针int.int b[5]分配空间5 int秒,声明b指向intint引用数组的常量指针(在大多数情况下可以将其视为常量指针int),并定义b为指向分配空间的指针.因此,int b[5]正在做更多的方式int *a,这也意味着int *a比更灵活int b[5].例如,您可以增加a,但不能b.

malloc在堆上分配内存.int b[5],如果一个全局变量,将在程序的数据段中(即它字面上编译成可执行文件).如果是本地的,它将在堆栈上分配.同样,相似,但不同.

方括号实际上做了一些指针运算吗?

在声明中,没有.当您使用指针变量是:x[y]是相同的*(x + y).所以a[1]是一样的*(a + 1),它也是一样的1[x](但请不要使用最后一个).

为什么内存地址分配给a*a

一个厚脸皮问题的厚颜无耻的答案:因为你写了a = ...而不是*a = ....

编辑:John Bode给出了一个有用的指针(heh):常量指针和数组引用不是一回事,尽管它们非常相似.首先,sizeof(...)会给出不同的结果.


Rem*_*eau 6

方括号实际上做了一些指针运算吗?

是.括号可以应用于任何指针,而不仅仅是数组.它们提供了指针算法指针解除引用的简写.您的代码基本上是这样做的:

int *a = malloc(5 * sizeof(int));

*(a+2) = 4;

printf("%d\n", *(a+0));
printf("%d\n", *(a+2));
Run Code Online (Sandbox Code Playgroud)

实际上这相当于:

int *a = malloc(5 * sizeof(int));

*((int*)(((unsigned long)a)+(2*sizeof(int)))) = 4;

printf("%d\n", *((int*)(((unsigned long)a)+(0*sizeof(int)))));
printf("%d\n", *((int*)(((unsigned long)a)+(2*sizeof(int)))));
Run Code Online (Sandbox Code Playgroud)


eml*_*lai 5

方括号实际上做了一些指针运算吗?

a[b]相当于*(a + b).所以是的,它是指针算术.它首先偏移指针b,然后访问该内存位置,就像一个数组.

为什么内存地址分配给a*a

存储器地址存储在a因为a指针和指针存储存储器地址.*a是该内存地址的数据.