質問: 0; *(a+i) != '\0' && *(b+i) != '\0'; i++ ) { if(*(a+i)<*(b+i)){ return 1; } if(*(a+i)>*(b+i)){ return -1; } } if(*(a+i)!='\0'){ return 1; } if(*(b+i)!='\0'){ return -1; } return 0; } ``` 2についてが、正直に言うとほとんどわかりませんでしたが、回答者の皆様のおかげですこしずつイメージ自体はつかめるようになってきました。そこで、コードを書いてみましたがいくつかエラーが出てしまいました。 具体的な書き方がつかめておらず、何点か不明な点があります。 〇わからないこと ・//str=(char *)malloc(sizeof(char)*n);では、エラーがでなかったがその直下にあるようにfor文でループさせるとエラーがでます。なぜでしょうか?また、このnは文字列の個数(何個の文字列を入力するか)なのですが、本来は1つ1つの文字列の長さ(文字が何個あるか)を入れるべきなのですが、文字列の長さを計算するにはまず文字列を入力しなければならないわけで、??となっております。 ・sort関数内で、tはint型で宣言されています。ここに代入するには文字列の先頭アドレスを代入すればいい、という認識であっているのでしょうか?(問題には参考としてバブルソートが書かれているだけなので無理して合わせる必要はない、とは思いますが) 〇わかったこと ・//str=(char *)malloc(sizeof(char)*n);の意味 char型のサイズ(1バイト)×n(ここでは文字列の個数(何個の文字列を入力するか)ですが)分のメモリをmalloc関数で確保し、それを(char *)に明示的に変換している。(左辺のポインタ変数strにあわせている?) ・関数sortの引数にポインタのポインタ(アドレス)があるが、そこにはポインタ変数のアドレスを渡せばよい。 ・参考として↑にあるバブルソートには文字列がint型に入っているが、そこにはポインタのアドレスを渡せばよい。 ``` #include #include int hantei(char *a, char *b); void sort(char **argv,int n); int main(void) { char *str; char enter; int i,n; printf("複数の文字列配列を辞書順に並び替えるぞ\n"); printf("文字列の個数入力して→"); scanf("%d",&n); enter=getchar(); //str=(char *)malloc(sizeof(char)*n); //下記にて説明有り for(i=0;i ",i+1); scanf("%s",str+i); } sort(&str,n); for(i=0;i=0;i--){ //「char *型はint型に変換できない」とエラーが出ます。 for(j=0;j*(b+i)){ return -1; } } if(*(a+i)!='\0'){ return -1; } else if(*(b+i)!='\0'){ return 1; } return 0; } ``` ### 試したこと まずポインタのポインタ(ダブルポインタ)のイメージがわかなかったため以下のようなコードを拾ってて、どのような動きをしているのか自分で図を描いて理解しました。(以下参照) ``` #include #define N 50 int main(void) { //普通のポインタ int t; char *str1,*str2,*str3; char fig[]="abcdefghijk"; str1=fig; printf("%c\n",*str1); //文字の出力 str2=fig; for(t=0;*(str2+t)!='\0';t++){ printf("%c",*(str2+t)); //文字列の出力 } printf("\n"); str3=fig; printf("%s\n",fig); //文字列の出力 //ダブルポインタの理解1 char *figure1,**figure2; char buf1[N]="あいうえお"; char buf2[N]="かきくけこ"; figure1=buf1; figure2=&figure1; *figure2=buf2; printf("%s\n",figure1); //ダブルポインタの理解2 char *month[3]={"January","February","March"}; char **p1,**p2,**p3; int i,j; p1=month; p2=month; p3=month; for(i=0;i<3;i++){ printf("%s\n",*(p1+i)); } for(i=0;i<3;i++){ printf("%s\n",*p2); p2++; } } ``` ![![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/ab2772d16cb4b30402644276537476e2.png) ↑上のプログラム内の //ダブルポインタの理解1 の図解 他にも様々なサイトを見ましたが、よくわからず ・配列だと要素数を宣言しないといけないが、ポインタのポインタとmalloc関数を使えばメモリを余分に使うことなく処理できる。 ということくらいしかわかりませんでした。 また、普通のポインタについてはアドレスなど、動きが理解しやすいのですがポインタのポインタについてはどのような考えをしながらコードを追っていけばいいのかがわかりません。 未熟者ですがどうかご指導よろしくお願いします。 ### 補足情報(FW/ツールのバージョンなど) 使用しているツールは、BCC Developerで、コンパイラはBorland C++ Compilerを使用しています。
回答: ポインタのポインタ、じゃなくて、ポインタのアドレス、です。 アドレスが入る変数がポインタと呼ばれます。その変数のアドレスを取ってくると、ポインタのアドレスですねー #ってそのままやんっ んで、なんでポインタのアドレスを引数に取るのか、といえば、 その引数の内容を関数から変更したいから、なんですね。 ``` void uniuni(int* p) { *p = 1; } と同様に、 void ahiahi(char** p) { *p ="uhiuhi"; } int i; uniuni(&i); // i は1 char* p; ahiahi(&p); // p は"uhiuhi"を指している ``` ってことができるようになるんですねー