如果指针存储变量的地址......那么我们从哪里得到指针?
我问的是,如果我们直接使用指针,那么必须有一个位置,我们从哪里得到这个指针?
答案 0 :(得分:26)
是的,声明的指针在内存中有自己的位置。
在上面的示例中,您有一个变量'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存储在寄存器中。)