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

削除された内容 追加された内容
ページの作成:「== 配列とポインタ == <pre> 書きかけ </pre> == 配列のポインタ == <pre> 書きかけ </pre> == ポインタの配列 == <pre> 書きかけ </pre>」
 
1 行
== 配列とポインタ ==
配列とポインタには密接な関係がある。
添字無しの配列の識別子は、
配列の先頭のメモリアドレスを指すポインタである。
つまり、別のポインタに配列のメモリアドレスを代入して、
ポインタ演算によって、配列にアクセスすることができる。
 
<pre>
//例1
書きかけ
#include <stdio.h>
 
int main(void)
{
int a[10]={2,3,5,7,11,13,17,19,23,29};
int *pa;
pa=a;//ポインタpaに配列aの先頭のメモリアドレスを代入する。
for(int i=0; i<10; ++i)
printf("%d ", a[i]);//配列aの内容を表示する。
printf("\n");
for(int i=0; i<10; ++i)
printf("%d ", *(pa+i));//ポインタpaを使って配列aの内容を表示する。
}
</pre>
 
多次元配列を指すポインタを使う時は、
配列の領域がどうメモリ上に確保されるか意識する必要がある。
例えば3行4列の2次元配列のy行x列にポインタを使ってアクセスするには、
次のように記述する。
<pre>
*(ポインタの識別子+y*4+x)
</pre>
 
<pre>
//例2
#include <stdio.h>
 
int main(void)
{
int a[3][4]={
0,1,2,3,
4,5,6,7,
8,9,10,11
};
int *pa;
pa=a[0];
 
//配列aの佩用を表示する。
for(int y=0; y<3; ++y)
{
for(int x=0; x<4; ++x)
{
printf("%2d ", a[y][x]);
}
printf("\n");
}
 
//ポインタpaを使って配列aの佩用を表示する。
for(int y=0; y<3; ++y)
{
for(int x=0; x<4; ++x)
{
printf("%2d ", *(pa+(y*4)+x));
}
printf("\n");
}
 
}
 
</pre>
 
また、ポインタが配列を指す場合、
ポインタに配列のように添字をつけてアクセスすることができる。
<pre>
//例3
#include <stdio.h>
 
int main(void)
{
char str[]="Hello, World!";
char *ps;
ps=str;
for(int i=0; ps[i]; ++i)
printf("%c", ps[i]);
}
</pre>
 
ただし、配列の識別子を使って、
その値を変更することはできない。
例3で次のようにすることはできない。
<pre>
++str;
</pre>