指针与堆中的内存之间的关系

Ral*_*lph 0 c memory heap allocation

我是一名新的C开发人员.我已经用Java编程了3年了.我注意到我必须用C做手动内存分配.

但是,当涉及到指针和内存分配时,我仍然不明确.我会说出我理解的内容,如果有人对我要说的话有任何评论,请指正.

所以我要说:

int *a;
Run Code Online (Sandbox Code Playgroud)

所以这样做会创建一个名为a的指针,指向一个整数值.

int *a = address;
Run Code Online (Sandbox Code Playgroud)

如果我打印地址,我会得到地址.

假设我想要价值,我做我们所谓的解除引用和

int *a = *value;
Run Code Online (Sandbox Code Playgroud)

如果我在这种情况下打印值,我会得到存储在内存中的实际数字.

我注意到在我使用的电子书中,有时候,我们在堆中分配内存.总是这样吗?每次我需要使用一个字符串的指针,例如使用char*,我必须使用alloc()和sizeof()分别根据预期类型的​​大小分配内存?

Ton*_* K. 5

好.针对Java人的指针.

当你申报时

int *a;
Run Code Online (Sandbox Code Playgroud)

它与Java中的相同:

Integer a;
Run Code Online (Sandbox Code Playgroud)

Java没有指针,但所有对象都由引用保存.所以,

Integer a = new Integer(3);
Run Code Online (Sandbox Code Playgroud)

是相同的:

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

在C.

现在,Java没有&运算符,你不能做指针运算,但参考确实大致相同.

回答你的问题:

  • 它总是必须来自堆?

在C中,您可以将指针指向已在堆栈中分配的内容(或RAM中的任何其他位置,例如用于执行硬件交互的DMA寄存器):

void f() {
   int i;
   int *a = &i;
   *a = 3; // same as i = 3

   a = (int*)0x12340000; // some address in memory, possibly screen RAM?
   *a = 0xffffffff; // possibly set some colors on the screen
}
Run Code Online (Sandbox Code Playgroud)
  • 我是否每次都必须使用malloc和sizeof来分配空间?

如果你确实使用malloc,那么是的,你必须指定你想要多少空间.但您可以轻松地要求编译器在静态数据空间中分配空间:

void f() {
   char *p = "hello";
   ....
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,文字字符串通常成为编译程序的一部分,并在OS程序启动时放置在静态分配的位置.