「C言語/配列とポインタ」の版間の差分

削除された内容 追加された内容
M編集の要約なし
Ef3 (トーク | 投稿記録)
→‎多次元配列と多次元配列へのポインター: 先頭要素へのポインターから配列の配列へのポインターに変更。
タグ: 2017年版ソースエディター
293 行
多次元配列の各次元の要素数を得るためには、次の様に隣り合った次元間のsizeof数の商を使います。
 
;[https://paiza.io/projects/mCDAP7k_h50E9w7u483CnQ?language=c 多次元配列の各次元の要素数を得る]:<syntaxhighlight lang="C" highlight='18,21' line>
#include <stdio.h>
 
304 行
printf("Y = %lu\n", sizeof a / sizeof *a);
printf("X = %lu\n", sizeof *a / sizeof **a);
for (int y = 0; y < sizeof a / sizeof *a; y++y) {
for (int x = 0; x < sizeof *a / sizeof **a; x++x) {
printf("%2d ", a[y][x]);
}
311 行
}
const int (*p)[sizeof a / sizeof *a][sizeof *a / sizeof **a] = &a;
for (int y = 0; y < sizeof a / sizeof *a; y++y) {
for (int x = 0; x < sizeof *a / sizeof **a; x++x) {
printf("%+2d ", (*p)[y][x]);
}
printf("\n");
}
printf("sizeof *p = %zu \n", sizeof *p);
}
</syntaxhighlight>
329 ⟶ 330行目:
+4 +5 +6 +7
+8 +9 +10 +11
sizeof *p = 48
</syntaxhighlight>
;多次元配列の配列へのポインターの宣言の例:<syntaxhighlight lang="C" start=18 line>
const int (*p)[sizeof a / sizeof *a][sizeof *a / sizeof **a] = &a;
</syntaxhighlight>
:{{code|(*p)}}と{{code|( )}}で括らないとポインターの配列の配列になってしまうので、{{code|( )}} は必須です。
:{{code|sizeof *a / sizeof **a}}は、単に {{code|4}} と書いてしまいがちですが、変更があったときに修正漏れがちで発見が困難なバグのもととなりえるので、隣り合った次元間のsizeof数の商で求めるべきです。
:{{code|*p}}をまた、{{code|( )a}}で括らいとポインターの配列になってしまうので、{{code|( )&a}}である須で要があります。
 
== 構造体配列のポインター ==