crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Хитрое объявление указателей в Си
Litkevich Yuriy
  опции профиля:
сообщение 29.6.2011, 7:09
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9649
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


const char * const * const listnames[] = {menu0, menu1};
как это читать?
Это указатель на указатель_на_масив?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 29.6.2011, 7:22
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


незнаю, но у меня не компилится такое в 2008 студии

а это компилится, и это указатель на массив
const char * const listnames[] = {"bbb", "aaa"};


Сообщение отредактировал DIMEDROLL - 29.6.2011, 7:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.6.2011, 7:35
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9649
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


на шёл в списке проблем одного из компиляторов, как не поддерживаемая форма объявления. Стало быть по стандарту допустимая.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.6.2011, 9:21
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2846
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 211 раз(а)




Репутация:   34  


а menu0, menu1 какой тип имеют ?

если я рассуждаю верно, то:

const char * const * const

- это тип элемента массива.

То есть:
    const char * const * const  i=0;   //элемент
    const char * const * const *pi=&i;  //указатель на i


два или больше "const" или "*const" подряд - эквивалентны одному. А это константный указатель на константный тип (этот указатель надо инициализировать сразу и менять далее нельзя)

    const char * const   i=0;
    const char * const  *pi=&i;


в итоге тип массива такой:

const char * const listnames[] = {"строка1", "строка2"};

-массив константных указателей на char
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.6.2011, 9:45
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Litkevich Yuriy @ 29.6.2011, 8:09) *
const char * const * const listnames[] = {menu0, menu1};
как это читать?
Это указатель на указатель_на_масив?

Это массив указателей на указатели char - по другому это двухмерный массив строк.



Цитата(DIMEDROLL @ 29.6.2011, 8:22) *
и это указатель на массив
const char * const listnames[] = {"bbb", "aaa"};

Нет, это массив указателей...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.6.2011, 9:52
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3284
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Алексей1153 @ 29.6.2011, 10:21) *
const char * const listnames[] = {"строка1", "строка2"};

-массив константных указателей на char
массив константных указателей на константные указатели на константный тип char :p
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.6.2011, 12:39
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1576
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


ViGOur прав.
Собственно, ничего сложного в объявлениях Си нет. Просто нужно с хвоста разбирать выражение и смотреть типы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.6.2011, 12:51
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Iron Bug @ 29.6.2011, 13:39) *
Собственно, ничего сложного в объявлениях Си нет. Просто нужно с хвоста разбирать выражение и смотреть типы.

Я бы уточнил... не с конца, а от самого идентификатора, и смотреть в операции слева и справа в зависимости от их приоритета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.6.2011, 14:01
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1576
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


Цитата(BRE @ 29.6.2011, 14:51) *
не с конца, а от самого идентификатора, и смотреть в операции слева и справа в зависимости от их приоритета.

я не могу вообразить ни одного примера, чтобы не с конца. "операции" там - функции и массивы(постфиксные) и указатели и ссылки(префиксные). первые имеют приоритет над вторыми. а редкие случаи указателей на функции или массивы разруливаются обычными скобками. в общем, всё равно в итоге выйдет, что с конца :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.6.2011, 5:42
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9649
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Так надо бы раз и на всегда с этим покончить.
Есть:
1)
const1 char * listnames1

2)
const1 char * const2 listnames2

3)
const1 char * listnames3[]

4)
const1 char * const2 * const3 listnames4[]

"Читаем по слогам" (номера при const - условность):
1) указатель (* listnames1) на константный (const1) char
2) константный указатель (* const2 listnames2) на константный (const1) char
3) массив указателей (* listnames3[]) на константный (const1) char
4) константный массив (const3 listnames4[]) константных указателей (const2 *), на указатель на константный char (const1 char *)

Всё верно?

Может список пополнить ещё какими-то родственными объявлениями, кто что помнит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.12.2018, 3:16