ここから本文です

c言語に関してです。 ポインタは配列として使用出来ますが、通常の配列とは何が違...

fra********さん

2011/10/719:27:57

c言語に関してです。
ポインタは配列として使用出来ますが、通常の配列とは何が違うのでしょうか?
例えば
char str[]="test";
と、
char *p="test";
は同じではない

のでしょうか?
ご回答お願いしますm(_ _)m

閲覧数:
258
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

azu********さん

編集あり2011/10/720:07:49

char str[]="test";



char str[]={'t','e','s','t','\0'};

と書いたのと全く同じです。str は&str[0]のアドレスを値としてもっていますが、それはいわば固定値をもつ文字列へのポインタであり、str=p; のような代入により値を変えるようなことはできません。

一方
char *p="test";
の場合は、メモリのどこかに"test"という文字列がとられ、それの先頭アドレスがpの初期値としてセットされます。

char *p;
p="test";

と書くのを1行で書いているわけです。

p は文字列へのポインタ変数なので、p=str のような代入は問題なくできることになるし、p++; とか p-- のようにその値を増減することもできるわけです。str のほうは定数なので str++; とか str-- なんてできません。

iがint型の整数である場合、

*(p+i) は p[i] とも書けるので、p[i] という形だけをみるとp は配列名と変わりがないじゃないかと思うかもしれませんね。しかし、上で述べたように、p の値は変えることができるという点で、配列名とは全く異なります。

ただし、両者が全く同じになるときがあります。これは関数の定義に現れる場合です。が同じなのはこの場合だけです。

質問した人からのコメント

2011/10/8 01:33:29

降参 なるほど、配列とポインタはそういう違いがあったのですか。
分かりやすかったです。ありがとうございました

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

編集あり2011/10/720:33:35

> ポインタは配列として使用出来ますが
誤り。

Cでは配列をポインタを用いて操作するために、表記上の約束としてポインタptrと整数値iについて
ptr[i] と *(ptr+i)
が等価であることにし、また配列の名前のシンボルは通常配列の先頭要素へのポインタを返すという規則を設けてはいる。
特に後者が「ポインタは配列」だという誤解を生むのだろうけど、きちんと考えればいずれも「ポインタが配列として使用できる」ということではない。配列を示すのにポインタを使う、だけ。ポインタはある「場所」を指し示すものでしかない。

char str[]="test";
test+\0が5文字分なので、要素数5の配列strを確保し、そこに文字列(=文字の配列)"test\0"をコピーする
char *p="test";
ポインタ変数pは、プログラムのデータエリアに予め格納されている文字列(=文字の配列)"test\0"の先頭アドレスを指すこととする
同じなのは、strもpも指している先が"test"という文字列になっているということだけ。意味は全然違います。

具体的に違いを示せば、
p="test2"; /* 可能 */
str="test2"; /* 文法的にエラー */

p[0]='a'; /* 一般にエラー(システムによる) */
str[0]='a'; /* 可能 */
p=str; /* pがstrそのものを指すようにする */
p[0]='b'; /* 可能。pはポインタなので、この辺の振る舞いは指し示す先によって変わる */

int size,size2;
size = sizeof(p); /* sizeofは変数の占めるメモリーの大きさを返す演算子。ポインタ変数の大きさがsizeに設定される */
size2 = sizeof(str); /* size2は配列の要素数によって変わる */
if( size==size2){
printf("配列とポインタは同一サイズ"); /* 多くの場合これは表示されない。もちろんsize==sizeになる要素数はあり得る */
}

k03********さん

2011/10/719:54:07

frandre1341さん

int main()
{
char *p;
p = "test";
printf("%s\n",p);

char str[5];
strcpy(str,"test");
printf("%s\n",str);
return 0;
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる