gpt4 book ai didi

c - 在有和没有&符号的情况下获取C中指针的地址,有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:22 25 4
gpt4 key购买 nike

我很难理解 this guide's code on pointers in C .我认为您需要一个符号来引用指针的地址,但指南的代码设法在没有符号的情况下获得它。我通过一项更改修改了他们的代码,并将其评论为“我添加的行”。该行与其上方的行相同,但包含一个 & 符号。这些线的评估产生非常相似的值,但不是相同的值。我的逻辑在哪里?

谢谢,那库尔

  #include <stdio.h>

int main () {

int var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */

ip = &var; /* store address of var in pointer variable*/

printf("Address of var variable: %x\n", &var );

/* address stored in pointer variable */
printf("Address stored in ip variable: %x\n", ip );

/* MY ADDED LINE: address stored in pointer variable */
printf("Address stored in ip variable: %x\n", &ip );


/* access the value using the pointer */
printf("Value of *ip variable: %d\n", *ip );

return 0;

最佳答案

指针只是一个普通变量,它保存其他东西的地址作为它的值。换句话说,指针指向可以找到其他内容的地址。您通常会想到一个包含立即值的变量,例如 int a = 5; , 指针将简单地保存地址 5存储在内存中,例如int *b = &a; .

作为普通变量,指针本身有一个地址。它的地址是变量本身的地址,而不是它存储的地址。例如,char buf[] = "foo", *p = buf;创建一个数组 buf并为 buf 中的第一个字符分配地址作为 地址 p (例如 p 指向 buf 中的第一个字符)。但是p本身在内存中有一个地址。它位于 p 的地址buf 中第一个字符的地址保存在内存中。一个简短的例子可能会有所帮助:

#include <stdio.h>

int main (void) {

char buf[] = "foo",
*p = buf;

printf ("address for buf : %p\n"
"address of 1st char : %p\n"
"address held by p : %p\n"
"address for p itself : %p\n",
(void*)buf, (void*)&buf[0], (void*)p, (void*)&p);
}

示例使用/输出

$ ./bin/pointeraddr
address for buf : 0x7fffbfd0e530
address of 1st char : 0x7fffbfd0e530
address held by p : 0x7fffbfd0e530
address for p itself : 0x7fffbfd0e540

现在让我们仔细看看指针保存的内容和指针地址(指针保存的内容保存在内存中的位置)为了简单起见,我们只使用地址中的最后三个数字。

char 数组 在哪里 buf存储在内存中?

    +---+---+---+---+
| f | o | o | \0| buf - array of char
+---+---+---+---+
5 5 5 5
3 3 3 3
0 1 2 3

当访问一个数组时,该数组被转换为指向第一个元素的指针,遵循以下条件:

(p3) Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary '&' operator, or is a string literal used to initialize an array, an expression that has type "array of type" is converted to an expression with type "pointer to type" that points to the initial element of the array object and is not an lvalue.

C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)

数组中的第一个字符是什么buf ? (答案:buf[0])第一个字符的地址是什么(使用一元 '&' 运算符)?它与 buf 的地址相同,但具有指向 char 的指针 类型(与 buf 相对,后者在访问时是一个指向数组的指针 char[4] )

p呢? ?它有自己的地址,地址指向 buf 中的第一个字符。被存储,例如

    +---+  p - pointer to char
| 5 |
| 3 | holds the address 0x7fffbfd0e530
| 0 |
+---+
5
4 stored at 0x7fffbfd0e540
0

如何获取p持有的地址的值(字符) ?您使用一元取消引用 运算符 *p .你如何获得p持有的地址? p已经是一个指针,所以简单地评估 p本身给出了 p 持有的地址,例如

char *q = p;

q现在持有 p 持有的地址存储在新地址 q在内存中创建。

或者,非常简单,打印 p 持有的地址现在也由q持有, 只需投 p (或 q )到 (void*)并使用 "%p" 打印转换说明符,例如

printf ("address held by p & q : %p\n", (void*)p);

没有魔法。指针只是一个变量,它保存其他东西的地址作为它的值。与任何变量一样,它都有自己的地址。如果您以这种方式考虑,您总是可以弄清楚您拥有什么 - 以及您需要做什么才能获取存储在该地址的值。

检查一下,如果您还有其他问题,请告诉我。

关于c - 在有和没有&符号的情况下获取C中指针的地址,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53568116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com