一些回复说您只能获取命名变量的地址,但这并不完全正确:如果您使用的是 C99 或更高版本,您还可以获取复合文字的地址或复合文字的字段。通常这对于调用一个函数很有用,该函数需要一个指向某个结构的 in 指针,您只需要在调用期间创建它。例子:draw(&(struct point){ 5, 10 });
可用于获取标量地址的一些途径[编辑并解释]:
// create a char array containing only 'a', dereference to get 'a', and take its address
char *c = &*(char[]){'a'};
// same as above, but using an array subscript
char *c = & (char[]){'a'}[0];
/* create a literal for one unnamed struct containing only the char member "c",
access .c, and take its address all in the same statement */
char *c = &(struct{char c;}){'a'}.c;
在包含块的持续时间内,*c 将等于'a'。
然而,使用复合文字获取文字地址的更简洁和更常见的方法是简单地声明一个只有一个元素的数组文字,这将像往常一样在赋值时衰减为指针:
char *c = (char[]){'a'};
这是该工作的相当典型的语法。但事实证明,该语言允许我们做一些更直接和稍微不直观的事情:我们可以声明一个标量类型的复合文字。这将上述所有内容简化为更明显的:
char *c = &(char){'a'};
在你的情况下,
#include <stdio.h>
int main(int argc, char const* argv[])
{
char *str[3];
str[1] = &(char){'a'};
return 0;
}
它比 '&' 更冗长一些,实际上只比分配临时变量少了几个键,但它确实存在。