2016-09-18 6 views
1

誰でも次のプログラムの仕組みを説明できますか?ここでname[]はcharへのポインタの配列です。次に、名前の代わりにアドレスの代わりに値が含まれています。どのように格納される値は文字ではなく文字列ですか?charのポインタの配列は、アドレスの代わりに文字列を保持できますか?

#include <stdio.h> 
const int MAX = 4; 
int main() {  
    char *names[] = {  
     "Zara Ali",  
     "Hina Ali",  
     "Nuha  Ali",  
     "Sara Ali", };   
    int i = 0;  
    for (i = 0; i < MAX; i++) {  
     printf("Value of names[%d] = %s\n", i, names[i]); 
    }   
    return 0; 
} 

答えて

0

はあなたが単純な例を取ることができます書き込むことができます。

char *s = "abcd"; 
printf("s = %p\n", (void *)s); // 1) address 
printf("s = %c\n", *s);   // 2) char 
printf("s = %s\n", s);   // 3) string 
ここ

sは(も、あなたのnames[i]と同様に、charへのポインタ)charへのポインタです。実際にはsは、1)アドレス、2)charへの通常のポインタ、または3)文字列と解釈できます。

最初にsがポインタであるため、sは、それが指し示すもののアドレスを保持します。 制御文字列を使用して、最初のprintfでどのアドレスかを確認できます。

第2に、sはcharへのポインタなので、最初の文字を出力するprintf %cを使用すると、通常と同じように扱うことができます。

第3に、sは、C string(別の方法は配列を使用しています)を宣言する1つの方法であるcharへのポインタです。 Cストリングは、区切り文字として\0で終わる連続した文字配列です。 printf %sを使用している場合は、文字列として印刷しています。

+0

私は "printf(" s =%c \ n "、* s);を書く文字としてsを使うために"文字列の場合は "printf(" s =%s \ n "、s);"と書いています。 –

+0

あなたは初心者ではありません(投票することができます)。 – artm

2

"Zara Ali"のような文字列リテラルは、その最初の文字のアドレスを評価します。

通常、文字列リテラルは読み取り専用データセグメントに格納されます。

本質的にあなたの配列にはアドレスが含まれています。

また

char *str="Zara Ali"; 
//The value of a string literal is the address of its first character. 
+0

"実際に文字列リテラルの値は最初の文字のアドレスです。 "という文字列を少し詳しく説明できますか? –

+0

@sameersoin文字列 '' Ali ''を考えてみましょう。メモリに格納され、読み取り専用セグメント(4バイト目は '\ 0 'を格納する)に4バイトのメモリを占有します。あなたが '' Ali ''を書いたとき、それはすべて第1バイトのアドレスです。したがって、 'char * ptr =" Ali ";'は 'ptr'に第1バイトのアドレスを割り当てます。 – Raman

関連する問題