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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎多次元配列と多次元配列へのポインター: 多次元配列へのポインターの宣言の例
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
cleanup
タグ: 2017年版ソースエディター
1 行
{{Nav}}
{{正確性|date=2017年3月}}
 
__TOC__
 
== 配列とポインタの基本 ==
配列とポインタには密接な関係がある。
 
式の中では、配列は「その先頭要素へのポインタ」に読み替えられる(この場合、ポインターのしめす型は配列の要素型であるが多次元配列では複合的になるので次数の計算が必要になる [[#多次元配列と多次元配列へのポインター|後述]])
 
また、p[i]は*(p+i)の[[W:糖衣構文|糖衣構文]]である<ref>p[i] ⇒ *(p+i) ⇒ *(i+p) ⇒ i[p] との交換則が成り立ち、難読化プログラミングでしばしば用いられる。<br>C言語のほかの糖衣構文]としては、 p->m ⇒ (*p).m があげられる。</ref>。
また、p[i]は*(p+i)の簡便記法である。
 
//例== 1次元配列を指すポインタの使用例ー ==
<ref>前橋和弥著『C言語 ポインタ完全制覇』p.061 平成13年6月25日初版第4刷発行</ref>
次の例のように、ポインターに配列のアドレスを代入し、ポインター演算によって配列の要素を参照することができる。
 
== ;1次元配列を指すポインターの使用例:<syntaxhighlight lang==c>
次の例のように、
ポインタに配列のメモリアドレスを代入して、
ポインタ演算によって配列にアクセスすることができる。
 
<syntaxhighlight lang=c>
//例 1次元の配列を指すポインタの使用例
#include <stdio.h>
 
int main(void) {
int a[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
 
int *pa = a;
for (int i = 0; i < sizeof a / sizeof *a; i++)
  //ポインタpaを配列aの先頭アドレスで初期化する。
printf("%d ", a[i]); //配列aの内容要素を表示する。
for (int i = 0; i < sizeof a / sizeof *a; i++)
printf("%d ", a[i]); //配列aの内容を表示する。
printf("\n");
 
for (int i = 0; i < 10; i++)
int *pa = a;
printf("%d ", *(pa + i)); //ポインタpaを使って配列aの内容を表示する。
for (int i = 0; i < 10sizeof a / sizeof *a; i++)
printf("%d ", *(pa + i)); //ポインタpaを使って配列aの内容要素を表示する。
printf("\n");
return 0;
}
</syntaxhighlight>
:{{code|sizeof a / sizeof *a}}は、配列の要素数を求めるイデオム。
 
== 多次元配列と多次元配列へのポインター ==
88 ⟶ 83行目:
 
== 参考文献 ==
*前橋和弥著『C言語 ポインタ完全制覇』平成13年6月25日初版第4刷発行
 
[[Category:C言語|はいれつとほいんた]]