0

先生から課題の修正を教えてもらいましたが、そこには二重ポインタを使用するコードが含まれています。私はCIにかなり慣れていないので、コードが何をするのか理解するのが難しい. シングルポインターの基本は知っているのですが、なぜかダブルポインタールートで道に迷ってしまいます。

コード:

#include <stdio.h>

main(int argc, char** argv){
    printf("\nHello ");
    char** runner = argv;
    ++runner;
    while(*(runner+2) != 0){
        **runner = toupper(**runner);     
        printf("%s, ",*runner);         
        ++runner;
    }

    **runner = toupper(**runner);   
    printf("%s ",*runner);    
    ++runner;
    **runner = toupper(**runner);   
    printf("and %s!",*runner);   
}

-最初の問題は、メイン関数がダブル ポインターを使用する理由を理解することですか? - 2 番目の問題は、ダブル ポインター ランナーを初期化した後、さらに 1 つの場所を指すように指示されています。しかし、あなたが知らない場所を指しているポインタを指している場合、一体どうやってそれが指している場所を知ることができますか?

  • これらの最初の 2 つのことを理解するのに問題があるため、先に進むことができず、コードがさらにどのように機能するかわかりません。

お時間をいただきありがとうございます

4

4 に答える 4

3

それを説明してみましょう:

main(int argc, char** argv){

通常のメイン関数は、問題を引き起こす可能性のある returntype が欠落しているだけです。(c90 対 c99 AFIK)。最初のパラメーターは 1 より大きいパラメーターの数です (最初のパラメーターはバイナリ名であるため (busybox のような複数呼び出しアプリケーションに役立ちます))。2 番目のパラメーターは、このバイナリーを呼び出したシェル用の文字列別名 char-array としてのパラメーターです。

printf("\nHello ");
char** runner = argv;
++runner;

そのバイナリの最初の引数 (バイナリ名) をスキップして hello を出力します。

while(*(runner+2) != 0){

現在のパラメーターの 3 番目のバイトがヌル バイトかどうかを確認しています。IMHO これは、2 番目のパラメーターがない場合に問題を引き起こす可能性があります。

    **runner = toupper(**runner);

大文字に変換します。

    printf("%s, ",*runner);

そのパラメータを出力する

    ++runner;

次の引数にジャンプします。

}
**runner = toupper(**runner);   
printf("%s ",*runner);    
++runner;
**runner = toupper(**runner);   
printf("and %s!",*runner);

ループとほぼ同じですが、2 バイトのパラメーターの後に来る次の 2 つのパラメーターを取ります。

于 2013-11-03T11:30:07.253 に答える