2013-07-03 2 views
0

Это расширение для моего предыдущего запроса - array of string pointers in Cсоздания 2D-массив из массива строковых указателей в C

У меня есть этот рабочий образец кода в C

int main(void) 
{ 
    char *array1 = "12345"; 
    char *array2 = "abcde"; 
    char *array3 = "67890"; 
    char *array4 = "fghij"; 

    char *array_2d[4]; 

    array_2d[0] = array1; 
    array_2d[1] = array2; 
    array_2d[2] = array3; 
    array_2d[3] = array4; 

    int i,j; 

    for(i = 0; i<=3 ; i++) { 
     for(j = 0; j<=4 ; j++) { 
      printf("%c", array_2d[i][j]); 

     } 
    printf("\n"); 
    } 

} 

Я хотел бы де-ссылка

*array1 to *array4 

т.е.

array_2d[0] -> "12345" 
.... 
array_2d[3] -> "fghij" 

и не

array_2d[0] -> array1 -> "12345" 
.... 
array_2d[3] -> array4 -> "fghij" 

Возможно ли это? Я бы, возможно, хотели бы увеличить array_2d в [8] и сказать

array_2d[4] -> array1 -> "ABCDE" 
.... 
array_2d[7] -> array4 -> "FGHIJ" 

Я надеюсь, что это кажется очевидным ....

EDIT -

Я думаю, я получил его. Это то, что я пытался сделать.

char *array1 = "12345"; 
char *array2 = "abcde"; 
char *array3 = "67890"; 
char *array4 = "fghij"; 

char *array_2d[8]; 

array_2d[0] = array1; 
array_2d[1] = array2; 
array_2d[2] = array3; 
array_2d[3] = array4; 

array1 = "AAAAA"; 
array2 = "BBBBB"; 
array3 = "CCCCC"; 
array4 = "DDDDD"; 

array_2d[4] = array1; 
array_2d[5] = array2; 
array_2d[6] = array3; 
array_2d[7] = array4; 
+0

Я не понимаю, о чем вы просите. 'array_2d' вообще не является двумерным массивом - это 1D массив указателей. Что означает ваша нотация 'array_2d [0] -> array1 ->" 12345 "'? –

+0

Теперь ваша ситуация - array_2d [0] -> "12345", а не array_2d [0] -> array1 -> "12345". Таким образом, вы достигли именно того, чего хотите. –

+0

Я хотел бы, чтобы array_2d [0] копировал «12345» из массива1, поэтому я могу очистить массив1 и сохранить (указать) «ABCDE», а затем массив_2d [4] копирует «ABCDE» из массива1. – Sid5427

ответ

4

Основываясь на комментариях, я думаю, что это то, о чем вы просите.

int main(void) 
{ 
    char *array1 = "12345"; 
    char *array2 = "abcde"; 
    char *array3 = "67890"; 
    char *array4 = "fghij"; 

    char *array_2d[8]; 

    array_2d[0] = array1; 
    array_2d[1] = array2; 
    array_2d[2] = array3; 
    array_2d[3] = array4; 

    array1 = "ABCDE"; 
    array2 = "GHIJK"; 
    array3 = "LMNOP"; 
    array4 = "QRSTU"; 

    array_2d[4] = array1; 
    array_2d[5] = array2; 
    array_2d[6] = array3; 
    array_2d[7] = array4; 

    int i,j; 

    for(i = 0; i<=7 ; i++) { 
     for(j = 0; j<=4 ; j++) { 
      printf("%c", array_2d[i][j]); 
     } 
    printf("\n"); 
    } 
} 

array1 переназначение не влияет на то, что array_2d[0] указывает. Первоначальное назначение просто копирует указатель, это не делает их псевдонимами друг для друга.

+0

Yup точно, что я просил. – Sid5427

1

Как и другие говорили, что это не совсем для меня ясно, что спрашивают, но это можно сделать копии строки следующим образом (это только один из возможных способов):

char *array_2d[8]; 

array_2d[0] = strdup(array1); 
... 
array_2d[4] = strdup(array_2d[1]); 
strupr(array_2d[4]); 
... 

Этот приведет к размещению отдельно выделенных строк в каждом месте. strdup делает копию строки. Обратите внимание, что для освобождения этой памяти вам необходимо позвонить free() (например, free(array_2d[0]);).

Еще одно замечание: OP указывает, что вы планируете модифицировать массив (строку), на который указывает array1. Вы не можете изменить эту память (это строковая константа). Вы можете изменить то, что указывает array1.