указатели на 2D-массивы - PullRequest
       5

указатели на 2D-массивы

0 голосов
/ 08 сентября 2011

У меня есть 2d массив, подобный этому ...

char a[][20]={"Hi","Hello","Bye","Good Morning"};

Теперь мне нужен указатель на символ, чтобы ссылаться на этот массив, изменить одну из строк в массиве через указатель и распечатать измененный массив и массивСквозной указатель ...

Изменения в массиве:

    strcpy(p+1,"Come");//copy string "Come" to array

    a[1][1]='O';//copy char 'O' index [1][1] 

т.е. .. Ожидаемый результат:

Массив: Привет, пока, доброе утро

Указатель: привет, пока, доброе утро

У меня проблема с назначением указателя на этот массив и печатью массива через указатель. Помогите ...

1 Ответ

0 голосов
/ 08 сентября 2011

Если вы хотите превратить ваш 2D-массив во что-то, что является массивом указателей на указатели на символы, вам нужно будет либо выделить место для вашего char** в стеке в локальной области видимости, либо динамически.Если вы выберете локальную область видимости, вам нужно будет просто создать массив char*, а затем сделать так, чтобы каждый член вашего массива указывал на каждую строку следующим образом:

char a[][20]={"Hi","Hello","Bye","Good Morning", "" };

int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;

char* ptrs[total_strings];

for (int i = 0; i < total_strings; i++)
{
    ptrs[i] = a[i];
}

Теперь вы можетеиспользуйте массив указателей, например ptr[i][j] (где j меньше длины строки в индексе i), и если вам нужно передать его функции по ссылке или назначить ее другой переменной, то *Массив 1009 * превращается в указатель, поэтому вы можете передать ptrs как char** в функцию или в другую переменную char**.

Следующим подходом будет динамическое выделение массива указателей... это будет выглядеть следующим образом:

char a[][20]={"Hi","Hello","Bye","Good Morning", "" };

int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;

//dynamic allocation of string pointer array 
char** ptrs = calloc(total_strings, sizeof(char*));

for (int i = 0; i < total_strings; i++)
{
    ptrs[i] = a[i];
}

//...more code
free(ptrs);

Кстати, вы не можете сделать что-то столь же простое, как char** ptr = a ... из-за способа, которым C ожидает память для char** подлежит выкладке.Другими словами, char array[][] на самом деле является линейным массивом в памяти, даже если он может быть проиндексирован как двумерный массив.С другой стороны, char** ptr - это переменная, которая содержит адрес памяти, указывающий на массив указателей.Таким образом, оба ptr должны содержать адрес, который указывает на правильный массив указателей, а каждый указатель ptr[i] должен содержать адрес, указывающий на массив char.Выполнение чего-то такого простого, как char** ptr = a, не создает правильную структуру памяти для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...