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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
59 行
{{See also|C言語/ポインタ#コラム:intにアドレス値を代入してはいけない!}}
 
== 配列の要素数を求めるイデオム ==
配列について {{code|sizeof a / sizeof *a}} というイデオムを用いて、配列の要素数を求めることができます
* 配列へのポインターを宣言する場合の要素数
 
* 要素個数分イテレーションするfor文のカウンター変数の上限
;1次元の配列を指すポインターの使用例:<syntaxhighlight lang="C">
などで有用です。
#include <stdio.h>
もし、計算によらずハードコードしてしまった場合、変更漏れの原因となり発見困難なバグの原因になります(上記の2例はコンパイラーの警告の対照にすることが極めて困難(不可能?)です。)。
 
int main(void) {
int a[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
 
for (int i = 0; i < sizeof a / sizeof *a; i++)
printf("%d ", a[i]); //配列aの要素を表示する。
printf("\n");
 
int *pa = a; // 配列名(この場合は「a」)はアドレスを示すので「&」をつけない。
for (int i = 0; i < sizeof a / sizeof *a; i++)
printf("%d ", *(pa + i)); //ポインターpaを使って配列aの要素を表示する。
printf("\n");
}
</syntaxhighlight>
 
実行結果
<pre>
2 3 5 7 11 13 17 19 23 29
2 3 5 7 11 13 17 19 23 29
</pre>
 
 
== 多次元配列と多次元配列へのポインター ==