我是新的C开发人员。我已经用Java编程了3年了。 我注意到我必须在C中进行手动内存分配。
然而,当涉及到指针和内存分配时,它仍然是模棱两可的。 我会说出我理解的内容,如果有人对我要说的话有任何评论,请纠正我。
所以我想说:
int *a;
所以这样做会创建一个名为a的指针,指向一个整数值。
int *a = address;
如果我打印地址,我会得到地址。
假设我想要价值,我做我们所谓的解除引用和
int *a = *value;
如果我在这种情况下打印值,我会得到存储在内存中的实际数字。
我注意到在我使用的电子书中,有时候,我们会在堆中分配内存。 总是这样吗?每次我需要使用一个字符串指针,例如使用char *时,我必须使用alloc()和sizeof()根据预期类型的大小分别分配内存?
答案 0 :(得分:5)
行。针对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,那么是的,你必须指定你想要多少空间。但您可以轻松地要求编译器在静态数据空间中分配空间:
void f() {
char *p = "hello";
....
}
在这种情况下,文字字符串通常成为已编译程序的一部分,并在操作系统启动程序时放置在静态分配的位置。
答案 1 :(得分:2)
int * a = * value;
除非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