いくつかの回答は、名前付き変数のアドレスしか取得できないと言っていますが、それは完全に正しいわけではありません.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' と等しくなります。
ただし、複合リテラルを使用してリテラルへのアドレスを取得するより簡潔でより一般的な方法は、1 つの要素のみで配列リテラルを宣言することです。これは、代入時に通常どおりポインターに減衰します。
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;
}
これは「&」よりも少し冗長であり、実際には一時変数を割り当てるよりも数キー少ないだけですが、それはあります。