C指针和地址

yCa*_*ran 1 c pointers memory-address

我一直以为*&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 */
}
Run Code Online (Sandbox Code Playgroud)

第一行printf(第13行)给我地址:

40b0a8 40b0a8 40b0a8

这与预期相同.但当我添加第二条printf线时,Borland抱怨道:

"first.c":E2027必须在第14行的函数main中获取存储单元的地址

我期待得到:

40b0a9 40b0a9 40b0a9.

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

第二个相关问题:该线

char *ap = a;
Run Code Online (Sandbox Code Playgroud)

指向数组a的第一个元素.我用了

char *ap = &a[4];  
Run Code Online (Sandbox Code Playgroud)

指向数组a的第5个元素.

是表达

char *ap = a;
Run Code Online (Sandbox Code Playgroud)

与表达相同

char *ap = &a[0];
Run Code Online (Sandbox Code Playgroud)

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

非常感谢...

CB *_*ley 6

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

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