【发布时间】:2015-04-14 01:27:09
【问题描述】:
我刚开始学习 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;
}
我没有将int *a 明确声明为指向数组的指针,但如果我为其分配一些内存,我可以像我已经 将其声明为数组一样使用a。用方括号声明一个指针只是我在下面所做的事情的快捷方式吗?方括号实际上是在做一些指针运算吗?
厚颜无耻的第二个问题
为什么内存地址分配给a而不是*a?
【问题讨论】:
-
声明带有方括号的指针只是我在下面所做的事情的快捷方式吗?方括号实际上是在做一些指针运算吗? 分别是可能和是。 为什么内存地址分配给
a而不是*a?因为你写的是a = malloc(...),而不是*a = malloc(...)。 -
从书中学习。 Here 是一些很棒的建议。
-
普通的书籍/教程通常会使这比需要的更难。
int *a;声明了int类型的指针a目前没有指向任何地方(它本身有一个地址,但它不包含任何其他地址 - 即它是一个空指针)。malloc保留一块内存并将起始地址返回给该块。a现在包含新块的起始地址。a[2]与*(a + 2)相同,只是表示获取 at addressa + 2的值。a被声明为类型int知道int是4-bytes,因此它为内存中的第三个int提供了正确的地址。 -
感谢您的及时回复。我有一些这样的书。我想我应该多加注意。
-
说真的,问题是在你达到一定程度的理解之前,真正的答案是没有意义的,所以试图在曲折的细节中“理解基础”并不是很刚开始时很有效率。这就是为什么它们对你来说不是“人类可读的”。最好只是通过并接受一段时间的浅层理解,直到足够的练习使一切都开始点击。