C中数字的指针

Ert*_*rul 3 c gcc pointers

假设有一个获取参数的函数int *

\n
void foo(int *x)\n{\n    \n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我想调用这个函数而不创建 int 变量

\n
int main()\n{\n    foo(&1);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

编译失败,我收到此错误消息:

\n
lvalue required as unary \xe2\x80\x98&\xe2\x80\x99 operand\n
Run Code Online (Sandbox Code Playgroud)\n

为什么1没有地址?那不是存储在堆栈中吗?

\n

gul*_*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

  • @Ertugrul 它创建***临时***对象。第一个具有“int”元素数组类型并衰减为指针。第二个类型为“int”,您需要使用“&”运算符来引用它 (2认同)