gpt4 book ai didi

C 指针和地址

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

我一直认为 *&p = p = &*p 在 C 中。我试过这段代码:

 #include <stdio.h>
#include <stdlib.h>

char a[] = "programming";
char *ap = &a[4];

int main(void)
{

printf("%x %x %x\n", ap, &*(ap), *&(ap)); /* line 13 */
printf("%x %x %x\n\n", ap+1, &*(ap+1), *&(ap+1)); /* line 14 */
}

第一行 printf(第 13 行)给出了地址:

40b0a8 40b0a8 40b0a8

与预期相同。但是当我添加第二行 printf 时,Borland 提示:

"first.c": E2027 必须在第 14 行的函数 main 中获取内存位置的地址

我期望得到:

40b0a9 40b0a9 40b0a9。

似乎第 14 行的表达式 *&(ap+1) 是这里的罪魁祸首。我认为第 14 行的所有三个指针表达式都是等价的。为什么我想错了?

第二个相关问题:线

char *ap = a;

指向数组a的第一个元素。我用过

char *ap = &a[4];  

指向数组a的第5个元素

是表达式

char *ap = a;

与表达式相同

char *ap = &a[0];

最后一个表达式是否只是比前一个更冗长?

非常感谢...

最佳答案

您只能获取左值 的地址,即引用对象的表达式。 ap + 1是地址计算。它有一个值,但它是一个临时对象,因此不是左值,您不能获取它的地址。

在回答你的第二个问题时,在表达式的大多数上下文中,数组会衰减到指向它的第一个元素的指针,所以是的,char *ap = a;char *ap = &a [0]; 是等价的。

关于C 指针和地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618802/

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