• ベストアンサー

ポインタで詰まりました;

charmer29-2の回答

回答No.5

配列形式([]演算子)を使ったからといって、(厳密に言えば)ポインタを使わないことにはなりません。 何故ならば、Cにおいて配列参照というものは全てポインタ参照で実現されるからです。 このことから、 anyType_t * pointer; // 任意の型のポインタ anyInteger_t integer; // 任意の整数型 としたとき、pointer[integer]と*(pointer + integer)は全く同じ意味になります。 #勿論、* pointerはintegerが0と考えて、pointer[0]と書けます。 尚、変数の定義のときはもう少しややこしくなるので要注意。 次の定義の意味の違いを理解しておくと、ポインタ演算が理解しやすくなると思います。 char str1[] = "abc"; char str1_2[] = {'a', 'b', 'c'}; // ナル文字がないから文字列として使えないので要注意 char str1_3[10] = {'a', 'b', 'c'}; // この場合は0(つまりナル文字)が補われるので文字列としても使える char * str3 = "def"; // これはただのポインタ変数(正しくはconst char * str3)

hope4673
質問者

お礼

回答ありがとうございます^^; ふむふむ、丁寧に細部まで説明してくださってありがとうございます。 とても分かりやすい説明でした。 次に問題をやる時も、書かれている点を注意しながら他の方の回答と照らし合わせながらやってみますね。 返信が送れて申し訳ないでした(ノД

関連するQ&A

  • ポインタ

    字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

  • ポインタ

    字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 必ず,具体的な解答を提示して下さい。 char str__com(char *s,char *t,int count) { while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

  • 関数ポインタについて

    関数ポインタを使用する際に、 指定する先の関数でデフォルト引数が指定されている場合、 関数ポインタを用いて、その引数を省略して呼び出すことはできるのでしょうか? 以下例とします。 void function(int a = 10){}; typedef void (*test)(int a); test a = &function; a(); //このように呼び出したい

  • ポインタのポインタの初期化法

     文字列をポインタを使って扱うとき、例えば、初期化は次のように行えますよね。 #include <stdlib.h> char *s; s = (char *)malloc(1000); (これに続いてscanf("%s", s);など)  これと同様にして、二次元の配列を、ポインタのポインタを使って表したいとき、 char **s; と宣言したものを、malloc()関数を使って初期化することはできるのでしょうか。よろしくお願いします。

  • エクセルに関する質問です!

    Excel2010を仕様しています。(windows) 関数を教えていただきたいのですが、 A列にあるデータとB列にあるデータが一致したとき 指定したセルにその一致した個数を返す関数は どのように書けば良いでしょうか。 ご教授ヨロシクお願い致します!!

  • Excelの関数

    Excelで、範囲指定した列に文字"○"があり、なおかつ文字"○"があった行の範囲指定した別の列に文字"△"があるセルの個数カウントをしたいのですが、その場合の関数がわかりません。 わかりづらい質問で申し訳ございませんが教えてください。 よろしくお願いいたします。

  • C言語 ポインタ型引数の呼び出しについて

    C言語 ポインタ型引数の呼び出しについて 私が作成したのではないのですが下記のような関数があります。 この関数は文字列を渡すとカンマ(,)で分割して返してくれる関数 らしいのですが、使用方法がわからず、こまっています。 char* abcdef(char** p) 当方としては下記のような変数定義を行っているのですが char cbuff[128]; //文字列(カンマを含めた) char *coutbuff[128]; //分割された文字列 理想としてはこんな感じで呼び出したいのですが strcpy(cbuff,"0,,123,45,6"); coutbuff=abcdef(cbuff); どのように呼び出したらよいかご教示願います。

  • ポインタ変数とポインタのポインタ

    ポインタ変数の宣言 char *a[]; をしたとき僕の中では a[0],a[1]...という、ある文字列A,B,C...の最初のアドレスを指すポインタが、配列になっているものを宣言していると理解していました。 しかしこの次に、ポインタのポインタが出てきました。僕はこれを、 ある変数を指し示すアドレスのアドレスである、と理解しました。 この2つは1つめはいくつかのアドレスを指し示すもの、2つ目は1つのアドレスを指し示すものであるとして、僕の中で異なったものであると理解していましたが、参考書「C標準コースウェア」によると プログラムにおいて、関数でポインタ配列を受け取るときchar *p[]はchar **pとしてもよい と書かれており、またその実例として、 (9-5) #include <stdio.h> void disp (char *p[],int n){ int i; for (i= 1;i<n;i++){ printf("%s\n",p[i]); } } int main(void){ char *girl[] = {"Arica","Candy","Lisa"}; disp (girl,sizeof(girl)/sizeof(girl[0])); return 0; } というプログラムが書かれていました。 ここで一気に訳が分からなくなりました。 char *girl[] = {"Arica","Candy","Lisa"}; と宣言されているため、 girl[0]はAricaという文字列の最初のアドレスを指すポインタ、 *girl[0]はAricaという文字列を直接指し示していると解釈しています。 girlは{"Arica","Candy","Lisa"}という文字列の配列の最初のアドレスを指し示していると考えました。 sizeof(girl)を使った時に不思議なのですが、 girlはどのように配列の終わりを理解しているのでしょうか? (配列の要素数を渡していない点が不思議です。) また、 disp側が受け取ったのは*girl[]であり、いくつかのポインタの配列ですが、渡したものはgirlという要素数がないポインタ1つだけです。 そして最初の疑問が出てくるわけですが、*p[]を**pと書きかえてみると、 文字列のアドレスを示すgirlという名の1つのポインタを渡すと、pという名のポインタのポインタで受け取るというのも、よくわからなくなっています。 おそらくポインタ配列に対する理解がどこかでずれているようですが、自分でどこがわからないのかわからなくなっています。 どうかご教授ください。

  • ポインタを使って

    みなさんこんにちは。 初歩的な質問ですみません。m(_ _)m キーボードから二つの文字列を読み込んだ場合、 読み込んだ文字列の中に同じ文字があるか、あれば その個数を数えるプログラム と言う問題があるのですが。 上記のプログラムは、for文を使って、一つ一つの文字をstrcmpを使って表示するべきものなのでしょうか。 もし、文の意味が違っていたり、もっと簡単なやりかたがありましたら、教えてください。 初歩的で申し訳ございません。

  • ポインタの結合に関する質問です

    *a=abc,*b=defなどの2つの文字列ポインタを関数を使わずに,1つのポインタ*cとしてまとめて出力したいのですがやり方がわかりません。過去に似たような質問があったのですが,その回答で実行したところエラーが多数でました。よろしくお願い致します。