私はそれを読みました;
複合リテラルは、名前のない配列を作成するために使用できる C99 機能です。例を考えてみましょう:
int *p = (int []){3, 0, 3, 4, 1};
p
3, 0, 3, 4
、およびを含む 5 要素配列の最初の要素を指し1
ます。
実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?
つまり、
char* str = "hello"
文字列"hello"
はメモリのどこに保存されますか?
私はそれを読みました;
複合リテラルは、名前のない配列を作成するために使用できる C99 機能です。例を考えてみましょう:
int *p = (int []){3, 0, 3, 4, 1};
p
3, 0, 3, 4
、およびを含む 5 要素配列の最初の要素を指し1
ます。
実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?
つまり、
char* str = "hello"
文字列"hello"
はメモリのどこに保存されますか?
ポインター演算の使用。そう
p[0], p[1], ...
また
*p, *(p + 1), ...
つまりね。C では、 や などのプリミティブ型int
やchar
、文字列リテラルの優れたリテラルがあります。したがって、次のようなことを簡単に言うことができます
int length(char *s);
int len = length("Hello, World!");
C99では、「配列リテラル」と「構造体リテラル」を扱うために、複合リテラルの概念が追加されました。したがって、次のようなことが言えます。
int sum(int a[], int n);
int total = sum((int []){ 17, 42 }, 2);
これは、複合リテラルを使用して「配列リテラル」を表しています。
実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?
はい、記憶に。
あなたの混乱はこれからだと思います。p
名前があります。(int []){3, 0, 3, 4, 1}
ではない。p
の値が のアドレスになるのはたまたまです(int []){3, 0, 3, 4, 1}
。もちろん(int []){3, 0, 3, 4, 1}
、記憶に残っています。実行可能ファイルのデータ セグメントになります。あなたはそれを参照する名前を持っていません。
ふたつのやり方:
&((int[]){3,0,3,4,1})[3]
と
((int[]){3,0,3,4,1})+3
リテラルが関数内にある場合、囲んでいるブロックが終了すると、リテラルへのポインターが無効になることに注意してください。