2015-11-28 2 views
1

Я пытался назначить слова char [x] [y] указателю char * [x]. Но компилятор дает мне ошибкуКак назначить массив 2D строк массиву указателей символов?

массив типа 'символ * [5]' не может быть назначен указатель = & слова [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-массив в массив указателей!

ответ

1

К сожалению, вы не можете сделать это так, как вам хотеть. char words[5][10] не хранит указатели в любом месте, это массив массивов из 50 символов. sizeof(words) == 50

В памяти, это выглядит примерно так:

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

Там нет адреса здесь. Когда вы делаете слова [3], которые просто (слова + 3), или (char *)words + 30

С другой стороны, char *pointer[5] представляет собой массив из пяти указателей, sizeof(pointer) == 5*sizeof(char*).

Итак, вы должны вручную заполнить массив pointer, вычислив смещения. Что-то вроде этого:

for (int i = 0; i < 5; i++) pointer[i] = words[i]; 
+0

** Спасибо !! ** это работает !! (y) :) – Pax

0

Ошибка в pointer = &words[0]; происходит потому, что вы берете «массив указателей» и указываете на первый массив символов, поскольку указатель указывает на символ, это не имеет смысла. Попробуйте что-то вроде:

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

Это сделает ваши указатели указывают на первый char ваших строк (?, Которые я принимаю желаемое поведение)

+0

ya it work ... ** Спасибо ** – Pax

Смежные вопросы