まず。C言語には「文字列」という基本型はありません。
C言語において文字列とは、
char型の配列で、データ並びの最後にNUL文字'\0'が終端のマークとして付けられているもの
ということになっています。なので、文字列は根っこのところで配列です。
そして、先日の質問への回答で書きましたけど、C言語では配列の扱いを、ほぼ配列の先頭要素へのポインタとみなします。
なので、文字列を管理するのはcharへのポインタ型、ということになります。
「管理するのは」と書きましたけど、文字列のデータそのものはchar型の配列に格納されていて、ポインタはその配列を指しているだけだ、という理解は必要です。
なお、今回は文字列が「リテラル」(定数)なので、定数の中身は書き換えられないということを盛り込んで
const char* cmd = "/usr/bin/ls -l /";
とするほうがベター(型に厳しいC++だとmust)とは思います。
ついでにいうと、これはご存知かと思いますが、
char cmdVal[17]="/usr/bin/ls -l /";
としたときには、cmdValはchar型の配列で、宣言時に"/usr/bin/ls -l /"と'\0'がコピーされます。配列の要素数を省略すると、配列の要素数はコンパイラが最小限を設定してくれます。
以上から、
C
1#include <stdio.h>
2char cmdVal_l[]="/usr/bin/ls -l /";
3char cmdVal_a[]="/usr/bin/ls -a /";
4char *cmd;
5int main(void){
6 cmd=cmdVal_l;
7 printf("%s\n",cmd);
8 cmd=cmdVal_a;
9 printf("%s\n",cmd);
10 return 0;
11}
とすれば、
/usr/bin/ls -l /
/usr/bin/ls -a /
が順次出力される、というのはいいですね?
しかし、
C
1#include <stdio.h>
2char cmdVal_l[]="/usr/bin/ls -l /";
3char cmdVal_a[]="/usr/bin/ls -a /";
4char cmd[17];
5int main(void){
6 cmd=cmdVal_l;
7 printf("%s\n",cmd);
8 cmd=cmdVal_a;
9 printf("%s\n",cmd);
10 return 0;
11}
というプログラムはエラーになる、というのが腑に落ちるようなら大丈夫でしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/06 00:44
2019/09/06 01:35