2012-04-26 7 views
1

次のコードのccは、配列cのベースアドレスを保持していますか、またはアルファベット「H」のアドレスを「Hello」から保持していますか?答えがベースアドレスである場合、cC++を実行した後にccが8バイト増分するのはなぜですか?なぜなら、2つのポインタを保持しているはずだからです。配列のあいまいさのベースアドレス

void foo(char *cc[]) 
{ 
    printf("%x\n",cc); 
    cc++; 
    printf("%x\n",cc); 
} 

int main() 
{ 
    char *c[] = {"Hello","World"}; 
    foo(c); 
} 
それだけインクリメントれます
+0

試しましたか?あなたが得たアウトプットは何ですか?私の32bitプラットフォームでは、4のオフセットがあります。 –

+1

私のコンピュータでは、8バイト増分します。多分あなたのプラットフォームは64ビットではありませんか? BTWは、移植性のために '%p'を使い、ポインタを' void * 'に変換してから印刷します。 – asaelr

+0

''ヘッダを追加し、 ''%x ''を ''%p ''に置き換えてポインタ値にキャストを追加した後、[ideoneは4の増分を示します](http://ideone.com/ 7tk1v)... – pmg

答えて

2

が何であれsizeof(char*)、配列要素があるようchar*

#include <stdio.h> 

void foo(char *cc[]) 
{ 
    printf("%x %s\n",cc,*cc); 
    cc++; 
    printf("%x %s\n",cc, *cc); 
} 

int main() 
{ 
    char *c[] = {"Hello","World"}; 
    printf("sizeof(char*)=%d\n", sizeof(char*)); 
    foo(c); 
    return 0; 
} 

出力:

 
sizeof(char*)=4 
bf8fd910 Hello 
bf8fd914 World 

bf8fd914 - bf8fd910 = 4

+0

配列要素はchar *ですが、ccと言うと配列の基底アドレスを意味するので、ccをインクリメントするとccは配列サイズでインクリメントされます。 – user1232138

5

cは、ポインタの配列です。最初のポインタ(c[0])は、文字Helloとそれに続くヌル文字で構成される文字配列を指しています。 c[1]は、ワールドとそれに続くヌル文字を含む別の文字配列を指します。

したがってccは、上記のようにc[0]を指します。 ccをインクリメントすると、前述のようにc[1]と同じになります。

何が起こっているのかをよりよく理解するために、これらのことを紙面に描画することをお勧めします。

+0

"hello \ 0"と "hello \ 0"ではなく "Hello \ 0"と "World \ 0"ですか? –

+0

@Alex - もしあなたがペダンティンなら、あなたはポイントを得る。 –

+0

OPにはポインタとの混乱が十分にあるため、不正確さが少なくなる可能性があります。 –

1
void foo(char *cc[]) 
{ 
    printf("%p\n",cc); 
    cc++; 
    printf("%p\n",cc); 
} 

int main() 
{ 
    char *c[] = {"Hello","World", "yo"}; 
    foo(c); 

    int *p = new int[1]; 
    int *q = p + 1; 
    printf("p = %p and p+1 = %p \n", p, q); 

    printf("sizeof(int) = %u, sizeof(dptr)=%u and sizeof 
     sizeof(int), sizeof(c), sizeof(*c)); 
} 

各ポインタは、value = valueによって指し示されています。
したがって、intポインタは4バイトだけインクリメントされます。
cc = {"hello"、 "world"}ポインタは16バイト、つまりptrあたり8バイトで増分されます* 2
とcc = {"hello"、 "world"、 "yo"}ポインタは24だけインクリメントされますバイト、すなわち1バイトあたり8バイト* 3

ccポインタが静的に初期化されていない場合(つまりchar ** c)、cは通常のポインタとして機能します。これは8バイトだけインクリメントされます。

+1

+1すてきな説明:-) – peeyush

0

ccの配列には2つのポインタがあり、最初の "hello"へのポイント、もう1つの "world"へのポイント!ccはポインタが格納されている配列です!

関連する問題