0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C】初めてのC言語(21. コマンドライン引数と二重ポインタ)

Last updated at Posted at 2022-10-16

はじめに

  • これまでの学習に続いて、今回はコマンドライン引数と二重ポインタについて学んだ結果をまとめてみました。

学習環境

  • 今回はpaiza.ioのC言語のエディタを使いました。

main関数の定義

  • これまでmain関数の引数はvoidでしたが、これとは異なるintchar**を引数に持つmain関数を宣言することもできます。
  • 2つの引数はそれぞれ以下の値となります。
    • argc:コマンドライン引数の数
    • argv:コマンドライン引数の中身
これまでのmain関数の書き方
#include <stdio.h>
int main(void){
    // 処理を書く
}
main関数の異なる書き方
#include <stdio.h>
int main(int argc, char** argv){
    // 処理を書く
}

二重ポインタ

  • 2つ目の引数のargvのデータ型はchar**となっており、これは二重ポインタと呼ばれます。
    • argvの指す先には、コマンドライン引数が配列として格納されているそうです。
    • この時、1つ目のコマンドライン引数を表すargv[0]は、1つ目のコマンドライン引数の文字列を「char型の配列」として格納されているそうです。
  • 文章で説明するのは難しいので実際に以下のコードを動かしてみると、「配列の中にchar型配列が入っているイメージ」なのが分かります。
  • paiza.io上ではCのエディタ上でコマンドライン引数を付けて実行できないため、bashエディタ上でMain.cをコンパイルした上で、出来上がった実行ファイルに引数を渡して実現しています。
Main.c
#include <stdio.h>
int main(int argc, char** argv){
    printf("argc=%d\n", argc);
    
    for(int i=0; i<argc; i++) {
        char* addr = argv[i];
        printf("%d番目のコマンドライン引数:%s\n", i, addr);
    }
}
Main.sh(※Main.cの実行用スクリプト)
# paiza.io上でMain.cをコマンドライン引数付きで実行するためのスクリプト
gcc Main.c -o Main.o
./Main.o Hello world
実行結果
argc=3
0番目のコマンドライン引数:./Main.o
1番目のコマンドライン引数:Hello
2番目のコマンドライン引数:world
argvの構造(※イメージ)
argv(char**型)
  ├─argv[0](char*型)
  │   ├─.
  │   ├─/
  │   ├─M
  │   ├─a
  │   ├─i
  │   ├─n
  │   ├─.
  │   └─o
  ├─argv[1](char*型)
  │   ├─H
  │   ├─e
  │   ├─l
  │   ├─l
  │   └─o
  └─argv[2](char*型)
      ├─w
      ├─o
      ├─r
      ├─l
      └─d

補足:これまでの学習の歩み

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?