假设有一个获取参数的函数int *。
void foo(int *x)\n{\n \n}\nRun Code Online (Sandbox Code Playgroud)\n如果我想调用这个函数而不创建 int 变量
\nint main()\n{\n foo(&1);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n编译失败,我收到此错误消息:
\nlvalue required as unary \xe2\x80\x98&\xe2\x80\x99 operand\nRun Code Online (Sandbox Code Playgroud)\n为什么1没有地址?那不是存储在堆栈中吗?
\ngul*_*lpr 11
为什么1没有地址?那不是存储在堆栈中吗?
不——这只是一个值。
您需要一个对象来获取其地址(引用)。常量表达式不是这样的对象。
您可以使用复合文字来创建临时对象:
void foo(int *x)
{
printf("%d\n", *x);
}
int main(void)
{
foo( (int[]){1} );
foo( &(int){1} );
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/xvdbTzn3Y
但字符串常量有地址有什么区别?
它们不是常量表达式,只是字符串文字。char``[C]字符串文字是or的数组const char``[C++]。字符串文字无法修改(它会调用未定义的行为)。它是一个对象,您可以获取它的地址:
void foo(char (*x)[])
{
printf("'%s'\n", *x);
}
int main(void)
{
foo(&"dsfgdfsgdfg");
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/q9s3P6xcb