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)
最后一个表达式是否比前一个表达式更冗长?
非常感谢...
您只能获取左值的地址,即引用对象的表达式.ap + 1是一个地址计算.它有一个值,但它是一个临时对象,所以不是左值,你不能取其地址.
在回答你的第二个问题时,在表达式的大多数上下文中,数组衰减到指向它的第一个元素,所以是的,char *ap = a;并且char *ap = &a[0];是等价的.