c-指针和堆中内存之间的关系



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

然而,当涉及到指针和内存分配时,它对我来说仍然是模棱两可的。我会说出我所理解的,如果有人对我所说的有任何评论,请纠正我。

假设我有:

int *a;

这样做的目的是创建一个名为的指针,指向一个整数值。

int *a = address;

如果我打印地址,我就会得到地址。

假设我想要这个值,我做我们称之为去引用和的事情

int *a = *value;

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

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

好。Java家伙的指针。

当您申报时

int *a;

它与Java中的做法相同:

Integer a;

Java没有指针,但所有对象都由引用持有。所以,

Integer a = new Integer(3);

与相同

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

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
}
  • 是否每次都必须使用malloc和sizeof来分配空间

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

void f() {
char *p = "hello";
....
}

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

int*a=*值;

除非value被声明为int **:,否则这是不正确的

int **value;

以下是使用带有适当注释的int指针的顺序:

int num1;          // Declare an int
int num2;          // Declare a different int
int *pNum = &num1; // Declare an int pointer and set its value to the address of num1
*pNum = 6;         // Set the value of num1
pNum = &num2;      // Change value of int pointer to the address of num2
*pNum = 10;        // Set the value of num2

最新更新