2

char * ポインター [x] に char ワード [x] [y] を割り当てようとしています。しかし、コンパイラは私にエラーを与えています

配列型 'char *[5]' は代入可能 ポインター = &words[0]ではありません

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char words[5][10]={"Apple", "Ball", "Cat", "Dog", "Elephant"};
    char *pointer[5];
    pointer = &words[0];
    char **dp;
    dp = &pointer[0];

    int n;
    for(n=0; n<5; n++){
        printf("%s\n", *(dp+n));
    }
return 0;
}

しかし、コードは動作します

char *pointer[5]={"Apple", "Ball", "Cat", "Dog", "Elephant"};
char **dp;
dp = &pointer[0];

必要なのは、2D 配列をポインター配列に正しく割り当てることだけです!!

4

2 に答える 2

2

残念ながら、思い通りにすることはできません。char words[5][10]ポインター自体はどこにも保存されません。事実上、50 文字の配列です。sizeof(words) == 50

メモリでは、次のようになります。

'A','p','p','l','e','\0',x,x,x,x,'B','a'...

ここには住所はありません。ちょうど (words + 3) である words[3] を実行すると、または(char *)words + 30

一方、char *pointer[5]は 5 つのポインターの配列ですsizeof(pointer) == 5*sizeof(char*)

pointerそのため、オフセットを計算して配列を手動で設定する必要があります。このようなもの:

for (int i = 0; i < 5; i++) pointer[i] = words[i];
于 2015-11-28T05:47:35.110 に答える
1

「ポインタの配列」を取得して最初の文字配列を指すようにしているため、エラーがpointer = &words[0];発生します。ポインタはcharを指しているため、これは意味がありません。次のようなものを試してください:

char *pointer[5];
pointer[0] = &words[0][0];
pointer[1] = &words[1][0];
//...

これにより、ポインターが最初charの文字列を指すようになります (これが望ましい動作だと思いますか?)

于 2015-11-28T05:45:27.277 に答える