我是一名新的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