C言語初心者です。よろしくお願いします。

下記、param01.cでは
showarray(&name); と
showarray(name);  とは

同じ結果が得られます。
文字列ポインタと文字列ポインタのアドレスは同じと考えて良いのでしょうか?
また、これら二つのコードをコンパイルしたときに

param02.c:18: warning: passing argument 1 of 'showarray' from incompatible pointer type

というエラーが出ます。なぜなのか教えていただけないでしょうか?



// param01.c

#include <stdio.h>

int showarray(int *x[]); //関数に値を渡すときは仮引数はポインタにしておく
//今の場合、ポインタのポインタになる。

int main()
{
char *name[]=
{
"Dirac",
"schrodinger",
"Bohr",
"broglie",
};

showarray(&name); // ポインタnameのアドレスを渡す。
showarray(name); // ポインタnameを渡す。

return 0;

}


int showarray(int *x[])
{
int i;

for (i = 0; i < 4; i++)
{
printf("x[%d] = %s¥n", i, x[i]);
}

return 0;

}


回答の条件
  • 1人5回まで
  • 登録:2009/02/08 16:43:17
  • 終了:2009/02/13 21:32:43

ベストアンサー

id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/02/08 17:59:04

ポイント40pt

配列のポインタと、配列のアドレスは同じと考えて良いのでしょうか?

#1の回答にも書きましたが、ポインタの値と配列アドレスの値は必ずしも同じになるとは限りません。

Intel系の環境(WindowsやLinux)であれば同じ結果になることが多いはずですが、他の環境でも同じになる保証はありません。

id:gbs01

回答ありがとうございます。

2009/02/08 18:09:46

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/02/08 17:04:24

ポイント30pt

文字列ポインタと文字列ポインタのアドレスは同じと考えて良いのでしょうか?

ご質問のケースは、文字列ではなく「配列」ですよね?

結果的に同じになることが多いようですが、すべての環境で同じになるとは言えません(ANSI Cではそこまで規定していない)。


というエラーが出ます。なぜなのか教えていただけないでしょうか?

関数 showarray の引数の型が int *x であるにもかかわらず、char *name を渡しているためです。


参考サイト

id:gbs01

ありがとうございます。

配列のポインタと、配列のアドレスは同じと考えて良いのでしょうか?

エラーの件、理解できました。

ありがとうございます。

2009/02/08 17:13:36
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/02/08 17:59:04ここでベストアンサー

ポイント40pt

配列のポインタと、配列のアドレスは同じと考えて良いのでしょうか?

#1の回答にも書きましたが、ポインタの値と配列アドレスの値は必ずしも同じになるとは限りません。

Intel系の環境(WindowsやLinux)であれば同じ結果になることが多いはずですが、他の環境でも同じになる保証はありません。

id:gbs01

回答ありがとうございます。

2009/02/08 18:09:46
  • id:Mook
    横やりですみませんが、 int *x と int *x[] は別物です。
  • id:gbs01
    なるほど、ありがとうございます。
  • id:Vacuum
    int X[3][4];
    int *X[4];
    int **X;

    2次元配列および、2次元ポインタにおいて Xと&Xは同じ値を保持します。
  • id:gbs01
    コメントありがとうございます。
  • id:tobeoscontinue
    >文字列ポインタと文字列ポインタのアドレスは同じと考えて良いのでしょうか?
    これは
    文字列ポインタの配列と文字列ポインタの配列のアドレスは同じと考えて良いのでしょうか?
    ということになります。
    文字列ポインタの配列は二次元配列と解釈されます。
    文字列ポインタの配列のアドレスは三次元配列と解釈されます。
    どちらも開始位置は同じなので同じと考えることは出来ますが二次元と三次元は異なるとも言えます。

    printf("%p %p\n", name,&name);
    printf("%p %p\n", name+1, &name+1);

    nameと&nameは同じ値を示しますが同じと考えるならname+1, &name+1も同じになるはずですがそうではありません。

    >warning: passing argument 1 of 'showarray' from incompatible pointer type というエラーが出ます。
    型は不一致です。
    showarray(name);の場合は
    int showarray(char *x[])とすることで回避できます。

    showarray(&name);の場合は
    int showarray(char *x[][4])とする必要があるようです。(今回の場合は4でなくても問題ないでしょう)
  • id:gbs01
    コメントありがとうございます。

この質問への反応(ブックマークコメント)

トラックバック

  • 2016-06-17 20:53:17
  • 2016-08-01 19:26:25
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません