ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Cの配列は分かる人に、ポインタを教える(その5)

2007-10-17 17:48:52 | Weblog


 その4のつづき。2重、3重のポインタとポインタ配列




■2重、3重のポインタ

2重、3重のポインタというのも、作れます。
こんなかんじ

char ***p;

 たとえば、文字列(char *str)がいくつか集まってレコード(行)を作る場合、

 char **rec;

 という形で、2重のポインタになりますし、


 この行がいくつか集まって、行列というか、表を作る場合は、

 char ***data;

 という形で、3重のポインタになります。





■ポインタ配列

 一方、intの配列、floatの配列、charの配列とか、いろいろ配列がありますが、ポインタも配列が作れます。こんなかんじ。

 char *rec[5];

 とか。。




以上で、このシリーズはおしまいです。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Cの配列は分かる人に、ポインタを教える(その4)

2007-10-17 13:19:10 | Weblog


 その3のつづき。一般の変数のアドレスとポインタへの代入の話。




■一般の変数のアドレス

 char c;

 などという形で、変数を宣言しますが、この変数、メモリ上のどっかにとって、値を格納します。ということは、「メモリ上の入っている場所」、つまりアドレスがあるはずです。

 実際、変数のアドレスは、&を付けると取得できます。
 &cで、cのアドレス(「メモリ上の入っている場所」)を示します。
 このときの&をアドレス演算子といいます。

 プログラムでは、こんなかんじ。

#include <stdio.h>

void main()
{
	char *str1;
	char c = 'H';

	//	ポインタに設定
	str1 = &c;

	//	ポインタでアクセス
	printf("%c ¥n",*str1);
}

(上記 ¥ < > は、本当は半角)

ちなみに、AND演算子も&ですが、AND演算子は引数が2個、アドレス演算子&は、引数が1個です。

 また、p&=a;と、p=&a;では意味が違うので(当然結果も違う)ので注意です。




■ここまでのまとめ

 ここまでの内容をまとめてみましょう。

 こんな表にまとめられます。

配列ポインタ一般の変数
宣言char array[]="abcd";char *p;char c;
アドレスarrayp&c
array[0]*pc


 次回は、このシリーズの最後として、2重、3重のポインタの話やポインタ配列の話について書きたいと思います。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Cの配列は分かる人に、ポインタを教える(その3)

2007-10-17 02:21:38 | Weblog

 その2のつづき。配列とポインタのはなし




■ポインタに配列をセット

ところで、いままで、mallocで領域をとってポインタにセットしていましたが、
実は、mallocでとった領域だけでなく、配列をポインタにセットすることも出来ます。
こんなかんじ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
	char *str1;
	char a[] = "Hello";

	//	配列をポインタに設定
	str1 = a;

	//	配列のようにアクセス
	printf("%c ¥n",str1[1]);

	//	ポインタでアクセス
	printf("%c ¥n",*str1);

	//	何番目かのモノを、ポインタでアクセス
	printf("%c ¥n",*(str1+1));

	//	++で足せる
	printf("%c ¥n",*(str1++));

}

(上記 ¥ < > は、本当は半角)

なんで、配列をポインタに入れることができるのか、考えます。




■アドレス

 その理由を考える前に、配列をポインタにいれている
str1 = a;
 について考えます。そもそも、aは何なんでしょうか?

 a[0]といったら、配列aの先頭の「値」です。

 aというと、(唐突ですが)配列aの先頭の「メモリ上の場所」を指します。

char a[] = "Hello";

 と宣言した場合、コンピューターのメモリー上に、Helloと値がセットされ、そのHelloの先頭(つまりH)が入っている場所がaにセットされます。
 この「メモリ上の入っている場所」のことをアドレスといいます。

 つまり、aは、アドレスです。

 それを代入しているポインタのstr1も、アドレスです。

 つまり、ポインタとは、「メモリ上に入っている場所」=アドレスを格納しているもので、*をつけると、その「メモリ上に入っている所」に入っている実際の値を返すということです。

つまり「なんで、配列をポインタに入れることができるのか」については、どちらも、アドレスを入れているのでということになります。




■ここまでのまとめ

 ここまでの内容をまとめてみましょう。

 こんな表にまとめられます。

配列ポインタ
宣言char array[]="abcd";char *p;
アドレスarrayp
array[0]*p


次に、一般の変数とアドレス、ポインタの関係について考えてみたいと思います。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする