C言語関係掲示板

過去ログ

No.144.ポインタと配列


No.916

ポインタについて。
投稿者---AKI(2002/01/23 16:20:58)


C言語初心者です。

どうしても、「アドレス」と「ポインタ」がわかりません。
使用方法については、マニュアル等にはあるのですが、
じゃあ、何故「アドレス」「ポインタ」を使用しなければならないのか
わかりません。
サンプルソース等見ても、どのプログラムも使用してあります。
基本の基本だと思いますが、納得がいきません。

誰か助けてください。


No.917

Re:ポインタについて。
投稿者---ともじ(2002/01/23 17:04:11)


AKIさん、こんにちは。

>じゃあ、何故「アドレス」「ポインタ」を使用しなければならないのか
>わかりません。

同じ疑問を持つ人多いですよね。
こんな過去ログもあります。見てみてください。
http://f1.aaa.livedoor.jp/~pointc/log103.html

No.918

Re:ポインタについて。
投稿者---AKI(2002/01/23 18:22:00)


>AKIさん、こんにちは。
>
>>じゃあ、何故「アドレス」「ポインタ」を使用しなければならないのか
>>わかりません。
>
>同じ疑問を持つ人多いですよね。
>こんな過去ログもあります。見てみてください。
>http://f1.aaa.livedoor.jp/~pointc/log103.html

ともじさん、ありがとうございます。
さっそく、そこで見つけた本を探してみます。




No.919

Re:ポインタについて。
投稿者---AKI(2002/01/23 18:48:01)


ポインタの使い方について、またまた質問です。

strcpy()関数
  char *strcpy(char *s1, char *2);
             ↑     ↑
            ポインタ  ポインタ
使い方としては、『s1の示す領域にs2の示す文字列を'\0'を含めて複写する』
 
「s1」「s2」は文字列ではなくポインタでないといけないのですよね。

 以下のプログラムがあるとします。

 main()
{
   static char s1[5] = "abcd";
       char s2[5];

   strcpy( s2 , s1 );
        ↑ ↑
       ポインタ ポインタ
}

これを見ると、「s1」と[s2] はポインタとして扱われているということなのでしょうか?
ある参考書に、『配列名が添え字をつけないで使用されると、それは配列の先頭の要素を
         示すポインタとみなされます』
 と記述がありました。
 ということは、「s1」と[s2]はポインタの定義をしていないけど、ポインタであるという
 ことなのでしょうか?
 これがわかれば、私にとっては、プログラムを作成するうえでかなり前進できるのですが。
 
 よろしくおねがいします。


No.920

Re:ポインタについて。
投稿者---shu(2002/01/23 20:30:10)
http://f1.aaacafe.ne.jp/~shuz/


> 以下のプログラムがあるとします。
>
> main()
> {
>   static char s1[5] = "abcd";
>       char s2[5];
>
>   strcpy( s2 , s1 );
>        ↑ ↑
>       ポインタ ポインタ
> }
>
> これを見ると、「s1」と[s2] はポインタとして扱われているということなのでしょうか?
> ある参考書に、『配列名が添え字をつけないで使用されると、それは配列の先頭の要素を
>         示すポインタとみなされます』
> と記述がありました。
> ということは、「s1」と[s2]はポインタの定義をしていないけど、ポインタであるという
> ことなのでしょうか?

ポインタというのは、アドレス(データの場所情報)入れるための変数です。
この場合、
s1 は、 &s1[0] の省略した形。
配列の n 番目の要素のアドレスは &s1[n] と表します。
s2 についても同じですね。

変数に値や変数が代入できるように、
ポインタには、アドレスやポインタが代入できます。


No.921

Re:ポインタについて。
投稿者---ともじ(2002/01/23 22:34:51)


> main()
> {
>   static char s1[5] = "abcd";
>       char s2[5];
>
>   strcpy( s2 , s1 );
>        ↑ ↑
>       ポインタ ポインタ
> }
>
> これを見ると、「s1」と[s2] はポインタとして扱われているということなのでしょうか?
> ある参考書に、『配列名が添え字をつけないで使用されると、それは配列の先頭の要素を
>         示すポインタとみなされます』
> と記述がありました。

char str[ ] = "ABCD";
cahr *p = str;
のとき、仮にstrが1000番地だとすると、
    p:1000
    str:1000 なので、
strをポインタとして表記しても間違いにはならないということです。

以下に示すプログラム、全部"ABCD"が表示されます。
i[str]なんて表現もできるのはおもしろいですよね。

ただ、私としてはあくまで配列は配列、ポインタはポインタとして
表記した方がわかりやすくていいと思います。

strcpy関数の場合、実引数にアドレスを渡し、仮引数をポインタ
として使うということで、実引数がポインタだということではありません。

#include <stdio.h>
int	main(void)
{
	char	str[] = "ABCD";
	char	*p = str;
	int		i;

	/* 1. 配列の中身を表示 → これはすぐわかりますよね */
	for (i=0; i<4; i++)
		printf("%c",str[i]);
	printf("\n");
	
	/* 2. 配列のアドレスの示す内容を表示 →
		strをポインタとして記述してもOK */
	for (i=0; i<4; i++)
		printf("%c",*(str+i));
	printf("\n");

	/* 3. これは2の順番を替えただけ */
	for (i=0; i<4; i++)
		printf("%c",*(i+str));
	printf("\n");
	
	/* 4. 3と同様に1の順番を替えることもできます →
		こんな表現は普通しませんが */
	for (i=0; i<4; i++)
		printf("%c",i[str]);
	printf("\n");
	
	/* 5. ポインタを配列的に使うこともできます */
	for (i=0; i<4; i++)
		printf("%c",p[i]);
	printf("\n");
	
	return(0);
}



No.923

Re:ポインタについて。
投稿者---ともじ(2002/01/24 14:20:54)


>strcpy関数の場合、実引数にアドレスを渡し、仮引数をポインタ
>として使うということで、実引数がポインタだということではありません。

strcpy()関数
  char *strcpy(char *p1, char *p2);

main()
{
   char s1[5] = "abcd";
   char s2[5];

   strcpy( s2 , s1 );


この場合、
  char s1[5] = "abcd";
  char s2[5];
  char *p1 = s1;
  char *p2 = s2;

と同じだと考えるとわかりやすいかもしれません。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.06
Copyright(c) 2000-2002 TOMOJI All Rights Reserved