我想用以下代码探索指针的壮举:
#include <stdio.h>
int x = 3;
int main(void)
{
printf("x's value is %d, x's address is %p", x, &x);
//printf("x's address is stored in", &&x);
}
它可以正常工作并获得输出
$ ./a.out
x's value is 3, x's address is 0x10b1a6018
当我使用&x
时,会为其预留一个存储空间以保留地址0x10b1a6018,因此将打印出一个地址。
随后,我打算获取有关存储另一个地址的地址的信息。
#include <stdio.h>
int x = 3;
int main(void)
{
printf("x's value is %d, x's address is %p", x, &x);
printf("x's address is stored in", &&x);
}
但是它报告错误为:
$ cc first_c_program.c
first_c_program.c:14:40: warning: data argument not used by format string [-Wformat-extra-args]
printf("x's address is stored in", &&x);
~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
first_c_program.c:14:42: error: use of undeclared label 'x'
printf("x's address is stored in", &&x);
^
1 warning and 1 error generated.
如何检索有关存储值x的内存地址的信息。
答案 0 :(得分:5)
&x
是一个临时值。它没有存储在内存中并且没有地址。
同样,&42
无效,因为42
没有存储在内存中(这也是一个临时值)。
您收到的有点奇怪的错误消息是因为gcc实现了一个一元&&
运算符,该运算符可用于获取标签的地址。这是C语言的非标准扩展。
要获得更好的错误消息,请使用& &x
(带空格)或&(&x)
。
但是您想要的东西根本不存在。
答案 1 :(得分:4)
let parameters: [String: AnyObject] = [
"latitude" : lat as! AnyObject,
"longitude" : lng as! AnyObject,
"lokasi" : (txtAlamat.text)! as! AnyObject,
"keterangan" : (txtKeterangan.text)! as! AnyObject,
"jenis_absen" : absenIndex as! AnyObject
]
是一个非左值表达式。它没有位置。 &x
需要一个lvalue作为其操作数(或函数)。
&
在标准C语言中根本不是有效的构造。地址不一定完全存储在任何地方-在您的程序中,因为&&x
是全局变量,这是一个编译/链接时常量!
相反,GCC使用一元x
作为扩展名来获取computed goto的跳转标签x 的地址。这本身并不会破坏C一致性,因为&&x
被解析为单个令牌,并且在标准C中不允许&&
作为一元运算符。
即你可以写
&&
答案 2 :(得分:1)
要执行所需的操作,您需要将&x
存储在变量中:
int* y = &x;
printf("%p", &y);