假设有获得int *个参数的函数.

void foo(int *x)
{
    
}

如果我想在不创建int变量的情况下调用此函数

int main()
{
    foo(&1);
    return 0;
}

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

lvalue required as unary ‘&’ operand

为什么%1没有地址?这不是堆叠存储的吗?

推荐答案

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

不--这只是一个价值.

您需要一个对象来获取其地址(引用).常量表达式不是这样的对象.

您可以使用compound literals创建临时对象:

void foo(int *x)
{
    printf("%d\n", *x);
}

int main(void)
{
    foo( (int[]){1} );
    foo( &(int){1} );
}

https://godbolt.org/z/xvdbTzn3Y

但是字符串常量有地址,这有什么区别呢?

它们不是常量,只有string literals个表达式.字符串文字是char``[C]const char``[C++]的array.不能修改字符串文字(它调用未定义的行为).它是一个宾语,你可以取它的地址:

void foo(char (*x)[])
{
    printf("'%s'\n", *x);
}

int main(void)
{
    foo(&"dsfgdfsgdfg");
}

https://godbolt.org/z/q9s3P6xcb

C++相关问答推荐

在C语言中,是否可以使枚举数向后计数?

插座打开MacOS组件

Kdb:仅升级指定的列

在txt文件中找到指定的字符串,并从数字中减go 相同的值

C:如何将此代码转换为与数组一起使用?

C语言中奇怪的输出打印数组

如何读取程序中嵌入的数据S自己的ELF?

从C中的函数返回静态字符串是不是一种糟糕的做法?

为什么我的二叉树删除删除整个左部分的树?

如何解释数组中的*(ptr)和*(ptr+2)?

使用 strtok 多次分割一个字符串会导致意外行为

C Makefile - 如何避免重复提及文件名

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

在 atmega4809 上使用 UART1 发送多个字符会导致发送 0xFF

C++11 的 constexpr 和 C23 的 [[reproducible]] 有什么区别?

如何使用jq判断c中的字符串是否是有效的json

为什么在C语言中,自动关键字对于编译器的编写者很有用?

一个个将字符读入数组的问题(使用C语言)

为什么 __m128 在与 float x/y/z 的联合中导致对齐问题?

从 struct 中的函数指针访问数据成员