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?
我没有显式声明
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(...)会给出不同的结果.
方括号实际上做了一些指针运算吗?
是.括号可以应用于任何指针,而不仅仅是数组.它们提供了指针算法和指针解除引用的简写.您的代码基本上是这样做的:
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)
方括号实际上做了一些指针运算吗?
a[b]相当于*(a + b).所以是的,它是指针算术.它首先偏移指针b,然后访问该内存位置,就像一个数组.
为什么内存地址分配给
a不*a?
存储器地址存储在a因为a指针和指针存储存储器地址.*a是该内存地址的数据.