Показать сообщение отдельно
Старый 10.11.2010, 19:16   #3
jimon
 
Сообщений: n/a
Ответ: Язык С - указатели

в данной ситуации для понимания спасает typedef, тогда :
typedef char** temp_type;
temp_type str[50];
собственно имеем 50 элементов типа temp_type, а тип temp_type это указатель на указатель на символ

чтобы еще лучше понимать как работают статические массивы то можно записать так :
typedef char** temp_type;
temp_type foo[50];
temp_type * str = foo;
здесь мы видим что foo по-сути является таким же указателем как и str, и обладает такими же свойствами, просто запись foo[50] используется чтобы выделить память на месте, с таким же успехом в последнем коде можно написать str[10] и мы получим 10 элемент (в принципе выражение str[10] просто превращается в *(str + 10) или *(temp_type*)((char*)str + 10 * sizeof(temp_type)), те к указателю str просто добавляем 10 размеров элементов на которые он указывает, если не приводить к однобайтовому типу то это просто +10, а если приводить то это +10 умноженное на размер элемента)

аналогично можно память выделить динамически
typedef char** temp_type;
temp_type * str = (temp_type*)malloc(50 * sizeof(temp_type));
...
free(str);
в данном случае память уже надо руками освобождать
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
baton4ik (10.11.2010), Reizel (11.11.2010)