それは絶対、アドレスではない始めている介して、あなたは文字列(char *
)にアクセスしていることを忘れていますvalue ...文字列にはどのような値を格納しますか? 「文字列」タイプを使用する必要があります。したがって、「文字列」の長さはどのくらいですか?
Cの文字列は、nul(\0
)で終わる印刷可能な文字数で構成されます。これらはメモリに保存されます。
char *argv[]
パラメータは、char *
要素の配列があることを指定しています。上記のように、char *
は文字列(またはchar
要素の配列)です。
char **argv
のように、char *argv[]
パラメータを正式に宣言することもできます。
たとえば、あなたは、メモリ内の自分のアドレスとともに、文字列の各文字の絶対値を出力することができます:ここで
#include <stdio.h>
int main(void) {
char *my_string = "Hello World";
int i;
for (i = 0; my_string[i] != '\0'; i++) {
printf("%c - 0x%02hhX - %p\n", my_string[i], my_string[i], &(my_string[i]));
}
return 0;
}
、我々はmy_string[i]
を使用して単一の文字を取得するには、ポインタを参照解除されています。
出力:
H - 0x48 - 0x400614
e - 0x65 - 0x400615
l - 0x6C - 0x400616
l - 0x6C - 0x400617
o - 0x6F - 0x400618
- 0x20 - 0x400619
W - 0x57 - 0x40061a
o - 0x6F - 0x40061b
r - 0x72 - 0x40061c
l - 0x6C - 0x40061d
d - 0x64 - 0x40061e
あなたが均等に(デリファレンスに注意してください)のようなので、このプログラムを実行することができます:
#include <stdio.h>
int main(void) {
char *my_string = "Hello World";
char *s;
/* s = my_string
* is equivelant to:
* s = &(my_string[0]) */
for (s = my_string; *s != '\0'; s++) {
printf("%c - 0x%02hhX - %p\n", *s, *s, s);
}
return 0;
}
'argv'がポインタに、ではない配列へのポインタでありますポインタの。それが指摘しているのは配列の中で最初のものです。 – StoryTeller
[時計回り/螺旋規則](http://c-faq.com/decl/spiral.anderson.html)の宣言では、 'char * argv []'宣言は 'argv'が'char'。私。文字列の配列技術的には、配列を引数として渡すことはできないので、実際には正しいわけではありませんが、実用上の理由から、 'argv'をどのように見るべきですか。文字列の配列として。さらに –
にアクセスする前に、 'argc'をチェックしてから' argv'要素にアクセスしてください。これは、範囲外の配列へのアクセスを避けるために付与されます。 – LPs