- 締切済み
関数のポインタ
char* check(int a,int b,int c) { return(\"yes\"); とした場合char* checkは何を表しているのでしょうか。 また、 char *str_copy(char d[], char s[]) { char *t=d; while(*d++ = *s++) ; return t; とした場合との違いはあるのでしょうか。 ポインタを返すときに*をつけると教わったのですがいまいち理解できなかったのですがどのような処理が行われているのでしょうか、お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
> int型へのポインタなどではint* check()などで表されるのでしょうか。 そうです。この例の場合、check()の戻り値は、 int型へのポインタです。
- mappy1983
- ベストアンサー率70% (7/10)
> 関数名に*がついている場合はいつでもその先頭アドレスが返されるんでしょうか。 返すのはchar *であれば良いので、別に先頭アドレスでなくてもかまいません。 ex. 1) return NULL; // NULLを返す ex. 2) return "yes"; // "yes"の先頭アドレス ex. 3) char x = 'a'; return &x; // xのアドレス ex. 4) char s[] = "yes"; return s; // sの先頭アドレス ex. 5) char s[] = "yes"; return s+1; // eのアドレス というような具合です。いずれも値ではなくメモリ上の場所を示す「アドレス」を返すという認識が大切です。
お礼
ありがとうございました。だいぶ理解が深まってきました。 メモリ上の場所を示すアドレスを返すときに使われるのですね。 また、勉強しなおします。
- asuncion
- ベストアンサー率33% (2127/6289)
> 関数名に*がついている場合 関数名に*が付いているのではありません。 type * func(...); と書くと、func()は、type型へのポインタを返します。
補足
ほんとにわかっていなくて申し訳ないのですが、 例えば、int型へのポインタなどではint* check()などで表されるのでしょうか。今まで関数の値を返すときにint型のポインタを返すプログラムを作ったことがないのですが、やはり、文字列を返すときなどchar型へのポインタのときにchar* check(引数)が行われるのでしょうか。
- mappy1983
- ベストアンサー率70% (7/10)
char* check(int a,int b,int c) { return("yes"); } メモリ上にある"yes"という文字列の「先頭アドレス(yのアドレス)」が返されます。 つまり、 値 メモリ上のアドレス(yesという文字列のある場所) [y] x 番地 [e] x+1番地 [s] x+2番地 とすれば、x(メモリ上のどこかのアドレス)が返されます。 char *str_copy(char d[], char s[]) { char *t=d; while(*d++ = *s++) ; return t; } dのアドレスがtにコピーされ、結果的にdという文字列の先頭アドレスが返されます。 つまり、 値 メモリ上のアドレス(dの配列のある場所) [e] y 番地 [x] y+1番地 [.] y+2番地 とすれば、y(dの先頭アドレス)が返されます。 どちらも文字列の先頭アドレスを返すという点で同じです。
補足
ご返答ありがとうございます。非常にわかりやすかったです。 関数名に*がついている場合はいつでもその先頭アドレスが返されるんでしょうか。
お礼
ご返答ありがとうございました。 おかげさまでなんとか今の段階で基礎のポインタは理解できそうです。