int * var[10] и int (*var)[10];

marizha

который из этих двух является указателем на массив, а который - массивом указателей?
по-моему, судя по приоритетам, первый var является указатлем на массив, но тогда возникает еще один вопрос по поводу инициализации этого var-а:
почему это правильно:

var[i] = new int;

т.е. получается, что var является массивом указателей а не указателем на массив?

teonazoi

code - для второго, ты вроде все правильно сказал.
для первого работает потому что эквивалентно
int **var;

pav7

вообще, указатель на массив можно сделать так :

int *a;


и выделить для него памяти сколько нужно, а потом обращаться c ним как с обычным массивом.

teonazoi

ты хочешь сказать, что int *a - это указатель на массив?
А может это указатель на целое.

int c;
int *a=&c;

pav7

нет, это указатель на массив. выделяешь память и вперед.
блин, я в терминологии не силен, но это что-то типа "типизированного указателя", а на что он указывает - это тебе решать.

Ivan8209

Указатель есть указатель.
Массивы в "Си" суть указатели, на самом деле.
В "Си" массивов именно как сборок просто нет.
---
"А я обучался азбуке с вывесок,
листая страницы железа и жести."

Ivan8209

Первое --- массив из 10 указателей, на него выделена памяти 10*(sizeof *
второе --- указатель на указатели, на него выделена памяти (sizeof *).
---
"А я обучлся азбуке с вывесок,
листая страницы железа и жести."

teonazoi

Хорошо

int *a;


указатель на начало массива(массив)

int * var[10]


указатель на память, где храниться адрес начала массива(указатель на массив)

marizha

to ? т.е. ты думаешь, что этот code для второго?
если да, то ты не правильно понял- это code для первого var-а...

Ivan8209

Любое объявление "type name[len]" есть, на самом деле, "type*name".
Отличие состоит только в начальном значении и выделении памяти.
Для уяснения тонкостей советую познакомиться с "Алголом-68".
---
"А я обучался азбуке с вывесок,
листая страницы железа и жести."

teonazoi

по сути своей оба объявления эквивалентны
int **var;
если у тебя нечто

var=(int **)malloc(sizeof(int*)*k);


то проблем не будет, а если нет, то результат операции не предсказуем(завист от начального значения var)

Aleksei66

Они не эквивалентны.
int* arr[10]; - массив указателей на int. Сами int могут быть, где угодно.
int (*arr)[10] - указатель на массив из 10 int. Все Int собраны в одном месте.
И грамотный компилятор должен различать, такие типы и предупреждать о неправильном использовании.

marizha

но как нужно инициализировать "int **var", чтобы получить указатедь на массив или массив указателей?
1)

var = new int*[10]; var[i] = new int;


2)?

stm2516219


*var = new int[10];

Оставить комментарий
Имя или ник:
Комментарий: