指针是否也有任何地址或内存分配?

时间:2009-06-13 17:15:51

标签: c pointers

如果指针存储变量的地址......那么我们从哪里得到指针?

我问的是,如果我们直接使用指针,那么必须有一个位置,我们从哪里得到这个指针?

5 个答案:

答案 0 :(得分:26)

是的,声明的指针在内存中有自己的位置。

alt text

在上面的示例中,您有一个变量'b',它存储值“17”。

int b = 17;    /* the value of 'b' is stored at memory location 1462 */

当您创建指向该变量的指针时,指针存储在其自己的内存位置

int *a;
a = &b;       /* the pointer 'a' is stored at memory location 874 */

编译器的工作就是知道“获取指针”的位置。当您的源代码引用指针'a'时,编译器会将其转换为 - > “无论地址值存储在内存位置874”。

注意:此图在技术上并不正确,因为在32位系统中,指针和int都使用四个字节。

答案 1 :(得分:10)

是。下面我有一个int和一个指向int的代码和用于打印出每个内存地址的代码。

int a;
printf("address of a: %x", &a);

int* pA = &a;
printf("address of pA: %x", &pA);

在32位系统上,指针占用4个字节。

答案 2 :(得分:4)

看看这篇SO帖子,以便更好地理解指针。 What are the barriers to understanding pointers and what can be done to overcome them?

就你的问题而言,如果我理解了你想要的东西,那么,基本上,当你声明一个指针时,你指定一个地址或一个数字索引,分配给系统中的每个内存单元(通常是一个字节)或者一个词)。然后,系统提供一个操作来检索存储在该地址的存储器中的值。

答案 3 :(得分:3)

在C:

char *p = "Here I am";

p然后存储存储“H”的地址。 p是一个变量。你可以指向它:

char **pp = &p;

pp现在存储p的地址。如果您想获得pp&pp等地址

答案 4 :(得分:1)

编译器处理将代码中的变量转换为机器指令中使用的内存位置。 指针变量的位置取决于它在代码中声明的位置,但程序员通常不必直接处理它。

在函数内声明的变量存在于堆栈或寄存器中(除非它被声明为静态)。

在顶层声明的变量位于程序顶部的一段内存中。

声明为动态分配的结构或数组的一部分的变量存在于堆上。

“&”运算符返回变量的内存位置,但与“*”运算符不同,它不能重复。

例如,* * * i得到地址* * i的值,这是地址* i的值,这是存储在i中的值,编译器会找出该值。

但&& i将无法编译。 & i是一个数字,它是编译器用于变量i的内存位置。这个数字不存储在任何地方,因此&& i毫无意义。

(注意,如果在源代码中使用& i,则编译器不能将i存储在寄存器中。)