char * и char[]
Недавно начал изучать С++ и возник такой вопрос: почему
не то же самое что и:
?
В голове появилась такая идея, что
то же самое что и
из-за того что в случае с указателем с данными массива работать нельзя.
Объясните, пожайлуста, новичку чем отличаются друг от друга 2 первые приведенные конструкции. :)
А ведь DaemonDZK абсолютно прав. То, что массив хранит информацию о количестве элементов в нём, в языках, производных от С, имеет очень маленькое значение.
Просто ты не умеешь этим пользоваться.
Ошибка "out of bounds" выдаётся лишь в случае индекса-константы. Все мы хорошо знаем, что чаще для этого используется переменная, значение которой известно лишь во время исполнения, о чём совершенно справедливо говорит DaemonDZK. Чего ты, Green, брызгаешь слюной, совершенно не понятно.
Я не брызгаю слюной, а пытаюсь объяснить.
Брызгаете слюной вы, пытаясь отрицать того, чего не понимаете.
При чем тут "out of bounds" ?
При чем тут компиляторы и время исполнения?
Я говорю о языке без привязки к компилятору.
Я говорю о типизированности языка С++, даже не о массивах и указателях как таковых, они лишь частный случай.
Вы просто игнорируете типы. А точнее, видимо, не понимаете их важности в языке С++.
Наверное, единственный способ это понять - плотно поработать с шаблонами.
char c[4];
char=0;
Я воспринимаю мысль полностью и цельно, но комментарии даю последовательно по каждому пункту.
Я же тебе и пишу, почему "имеет очень маленькое значение": потому что можно использовать только при работе с константными индексами. А кому это надо? Что толку от этой информации, если можно написать:
char c[4];
char=0;
По твоему и только по твоему "имеет очень маленькое значение", потому что ты не умеешь использовать эту информацию. Ты уперся в ошибку компиляции и выход за границы массива.
А смысл в том, что я могу на основе информации о типе строить различные методы обработки.
Простейшие способы использования информации типа массив:
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
......................
}
как видишь можно использовать информацию о размере массива в памяти и размере одного элемента этого массива.
{
// для массива из 3х элементов будет вызвана эта функция
}
void func( int(&)[4] )
{
// для массива из 4х элементов будет вызвана эта функция
}
как видишь перегрузку можно осуществлять не только для "обычных" типов, то и для типов массивов и размерность массива является характеристикой его типа.
void func(const T(&)[N]) {
cout << "This is an array of " << N << " elements" << endl;
}
template<class T>
void func(const T&) {
cout << "This is not array" << endl;
}
int main()
{
int a[3];
func(a);
int b;
func(b);
return 0;
}
как видишь при использовании шаблонов можно получать и использовать информацию о размерности массива.
Более того, компилятор сам может сказать, где у тебя массив, а где указатель:
void func(T(&)[N]) {
cout << "This is a array of " << N << " elements" << endl;
}
template<class T>
void _func(T*) {
cout << "This is a pointer" << endl;
}
template<class T>
void _func(T&) {
cout << "This is not pointer" << endl;
}
template<class T>
void func(T& v) {
_func(v);
}
int main()
{
int a[3];
func(a);
int* b;
func(b);
int c;
func(c);
return 0;
}
Я объяснил тебе "что толку от этой информации" ?
Ты до сих пор считаешь, что "можно использовать только при работе с константными индексами" ?
А потом ты опять вплотную привязываешься к своему любимому С++, отсюда и разговоры о шаблонах. Кажется, обсуждаемая проблема шире и не сводится к особенностям С++. Ты говоришь , а мы говорим именно о них.
А какая проблема? Объясни.
А то вы говорите, а о чем говорите в чем проблему нашли и сами не знаете.
Ты, кстати, выдрал кусок из фразы, и начинаешь плясать во круг него.
При этом почему то не внял продолжению фразы "они лишь частный случай".
Я тоже говорю "именно о них", но с общей позиции, которую ты в упор не хочешь замечать... или не можешь... Это называется - близорукость. Попробуй отойти на некоторое расстояние, взгляни на вещи более абстрактно, и тогда многое становится столь явным, что и спорить то не о чем.
Я говорил о разности записи
const char *name = "Vitka";
и
const char name[] = "Vitka";
для программиста С++.
И что основная разница - это то, что это РАЗНЫЕ ТИПЫ.
Далее я рассказал о том в чем разница и проблемах понимания значимости типов в С++.
Отсюда и разговоры о шаблонах, которые в основном и оперируют типами. Не типами в основном нужны для шаблонов, а для шаблонов в основном нужны типы, т.к. типы играют большую роль и в других вещах, например перегрузках.
Запись char name[] = "Vitka"
приводит к созданию константного указателя, т. е. указателя, который нельзя "перевести" на другой объект (строку, в данном случае).
Запись же
char *name = "Vitka"
приводит к созданию указателя, который изначально указывает на строку "Vitka", но этому указателю можно назначить другой адрес, и он станет указывать на другую строку.
Кстати, сама строка в обоих случаях неконстантна, т. е. можно изменять ее содержимое.
name = "Bulat"; // Нормально
char name1[] = "Vitka";
name1 = "Bulat"; // Ошибка компиляции
Насколько я понимаю, такой код недопустим, т.к. строка "Vitka" бесследно теряется в памяти после того, как name начинает указывать на другую строку. Можно поступить так:
Ну сколько можно? Читаем посты и примеры выше.
Сама по себе строка "Vitka" уже константна и хранится в секции данных только для чтения, если компилеру не сказано хранить ее в секции для R/W данных, но это уже ересь и сего надо избегать, почему думаем сами.
name[0] = 'S';
Т.е. вот такое, без игр с компилером, вызовет вам "Access violation" причем при работе программы.
{
char* const name = "Vitka";
char[] name = "Vitka";
return 0;
}
Конструкции отличаются одним маленьким нюансом, во втором случае будет создана копия строки в автоматической памяти т.е. стеке. Есть условия при которых сия копия создаваться не будет, но какие опять же думаем сами.
PS:
- А вы и пальцы за меня загибать будете?
- Ага!
Сама по себе строка "Vitka" уже константна и хранится в секции данных только для чтения, если компилеру не сказано хранить ее в секции для R/W данных, но это уже ересь и сего надо избегать, почему думаем сами.
А я думал, что такая конструкция создаёт константный указатель на неконстантную строку. А что, у вас другое мнение?
Да не было там никаких пунктов. Всё это была одна мысль. Ну да ладно, это ерунда. А по сути вот что. Наверное, твоей лекции нужно стоя поаплодировать: я о таких интересных вещах в жизни не слышал. Да только вот ведь незадача: это всё снова С++. Например то, что ты написал о шаблонах, я конечно просмотрел - только хрен что понял: не имею ни малейшего представления, что такое шаблон в программировании. :-) Так что лично на меня это не произвело впечатления, извини. Вот это - это да:
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
......................
}
как видишь можно использовать информацию о размере массива в памяти и размере одного элемента этого массива.
- такой код я мог бы использовать... Только зачем? Если чёрным по белому написано, что в массиве 5 элементов, почему не написать по-человечески: int i=0; i<5; i++? Может быть ты скажешь: "А вдруг понадобиться модифицировать программу и изменить количество элементов в массиве? Что же, лазить по коду и искать эту несчастную пятёрку?" - "Да нет, зачем же? Давай просто используем #define", - отвечу я. :-) Так что это меня тоже не убедило.
А вот эта фраза меня порадовала больше всего:
Очень напоминает, как меня учили немецкому языку в школе: читаешь текст, видишь знакомые слова, но смысл текста уловить нет никакой возможности. Всё время какая-то чушь получается. Зато весело. Нет, определённо, есть свои преимущества в невежестве. Но ты, Green, не расстраивайся. Наверное, это всё очень прикольно и умно. Серьёзно. :-)
А я думал, что такая конструкция создаёт константный указатель на неконстантную строку. А что, у вас другое мнение?
А задайтесь вопросом - "А где существует та строка на которую указывает ваш константный указатель?" не в пустоте же и не в другом измерении. Как сказали бы старшие товарищи - "учим мат. часть" и начните с того, что есть программа, процесс, поток, физическая память, виртуальная память, статическая память, динамическая память и наконец указатель.
PS: Опал в осадок, больше ни одного комментария в данной теме ибо бесполезно, непонимание все возростает, ну да ничего осознание господа к вам придет позже, если конечно вы этого захотите.
А ты о чем тут говорил? О Бейсике?
Только вот ведь незадача: раздел то по С/С++, а топик именно про С++.
Например то, что ты написал о шаблонах, я конечно просмотрел - только хрен что понял: не имею ни малейшего представления, что такое шаблон в программировании. :-) Так что лично на меня это не произвело впечатления, извини.
А я на тебя и не пытался произвести впечатления.
Ну не знаком ты с С++, что тут поделаешь... не судьба...
Только не понятно, чего ты в тему то по С++ тогда влез?
Так... для компании?
Вот это - это да: - такой код я мог бы использовать... Только зачем? Если чёрным по белому написано, что в массиве 5 элементов, почему не написать по-человечески: int i=0; i<5; i++? Может быть ты скажешь: "А вдруг понадобиться модифицировать программу и изменить количество элементов в массиве? Что же, лазить по коду и искать эту несчастную пятёрку?" - "Да нет, зачем же? Давай просто используем #define", - отвечу я. :-) Так что это меня тоже не убедило.
Ну ведь это же всего-лишь простейший пример. Сложных приводить не буду, опять "хрен поймешь".
А вот эта фраза меня порадовала больше всего:Очень напоминает, как меня учили немецкому языку в школе: читаешь текст, видишь знакомые слова, но смысл текста уловить нет никакой возможности. Всё время какая-то чушь получается. Зато весело. Нет, определённо, есть свои преимущества в невежестве. Но ты, Green, не расстраивайся. Наверное, это всё очень прикольно и умно. Серьёзно. :-)
Да я не расстраиваюсь. Мне, слава Богу, с тобой дел не иметь. Так что пользуйся своим "преимуществом" и ни в коем случае не учи С++.
2ShadyMan:
Не влезая в вашу дискуссию для двоих, просто хочу высказать свое скромное мнение.
Shady ты наверное поклонник исполняемых языков (интерпретируемых, скриптовых) и для тебя наверное не столь насущна проблема контроля типов и отлавливания ошибок на этапе компиляции, а ведь это каждый день спасает сотни неврных клеток (которые потом просажываются на формумах и чатах ;)) у сотен тысяч программистов.
2Green:
Опять же не влезая в вашу дискуссию...
Практически во всем согласен, а некоторые примеры даже возьму на заметку (хм (&)[], интересный контроль соответствия размера передаваемого массива...), как то раньше не задумывался так упрощать себе жизнь:D
[quote=Green]Так что пользуйся своим "преимуществом" и ни в коем случае не учи С++.[/quote]Угу, обязательно воспользуюсь и ещё не раз. :-) В общем, спасибо, здорово повеселил.
[quote=WidowMaker]Shady ты наверное поклонник исполняемых языков (интерпретируемых, скриптовых)[/quote]Да нет, просто на С пишу.
Честно сказать - правда, действительно, мало. Даже больше - в последнее время вообще не пишу. Но ты это к чему?
А что для тебя значит быть ортодоксом в программировании?
Если ты узнаешь себя, то наверно не понимаешь о чем я тут распинаюсь........
Тему внимательней почитай. И ответь для себя - что такое динамический массив ))
придумал простенький пример, доступный для понимания, не только программистам С++:
for (int i=0; i<sizeof(array)/sizeof(array[0]); ++i) {
..............
}
никако #define не надо, он только усложнит код.
Я к тому, что то что ты понимаешь скорее всего под "динамическим" массивом к данному коду уже не имеет отношения. И работать с ним так уже будет нельзя.
Ты считаешь, что твоё незнание ставит тебя в выгодное положение?
Зря ты так. Green, конечно, бывает грубоват, но плохого не посоветует.
Так какого чёрта о C++ рассуждаешь? Сказано же: большое значение такое разделение типов имеет для шаблонов и перегрузки операторов и функций. Если не знаешь, что такое шаблон -- C++ в этом не виноват.
А это он к тому, что если начнёшь работать над большими быстро развивающимися проектами, тогда жизнь (читай: лавинообразное нарастание багов в твоей программе) заставит более внимательно относиться к советам бывалых программеров вроде Green.
и что же по твоему я понимаю под "динамическим" массивом?
Можно с примером. )
во вторых, я действительно ошибся. этот код не выдаст размер динамического массива.
Сначала, конечно, обращаюсь к глубоко- и многоуважаемому корифею. :-)
[quote=Green]придумал простенький пример, доступный для понимания, не только программистам С++:
Код:
for (int i=0; i<sizeof(array)/sizeof(array[0]); ++i)
{ .............. }
[quote=Plisteron]Так какого чёрта о C++ рассуждаешь? Сказано же: большое значение такое разделение типов имеет для шаблонов и перегрузки операторов и функций.[/quote]Где же это я о С++ рассуждал? Внимательнее читать надо. Я только написал, что всё описываемое Green'ом имеет значение лишь в С++, хотя обсуждаемая тема касается всех производных от С языков. Просто смешно видеть такую зашоренность. У Green'а получается так, что если только где-то слышен слог "си", то это сразу понимается как разговор о С++ и если что-то не укладывается в рамки объектно-ориентированного программирования, то значит это уже от лукавого.
2Free Thinker. А всё-таки интересно, что ты имел в виду под динамическим массивом?.
2WidowMaker. Странное какое-то у тебя понимание слова "ортодокс", прямо скажем, извращённое. Нет, такими вещами я не занимаюсь. Более того, тот же самый Green меня таки убедил где-то около полугода назад, что читабельность кода куда важнее незначительного выигрыша в производительности.
Но больше всего меня забавляют высказывания типа: "если начнёшь работать над большими быстро развивающимися проектами", "если тебя когда-нибудь возьмут в комманду программистов (что очень сомнительно)" и т. д. Да, действительно не возьмут, и не рвусь я туда, потому что не программист :-) и никогда им не стану, о чём ничуть не жалею, кстати.
- вот это я понимаю, наконец-то первый более-менее полезный пример.
Если точнее, это первый "более-менее полезный пример", который ты понимаешь. Т.к. остальные примеры тоже полезные, только полезности ты их, как сам и заявлял, не понимаешь.
Я только написал, что всё описываемое Green'ом имеет значение лишь в С++, хотя обсуждаемая тема касается всех производных от С языков. Просто смешно видеть такую зашоренность. У Green'а получается так, что если только где-то слышен слог "си", то это сразу понимается как разговор о С++ и если что-то не укладывается в рамки объектно-ориентированного программирования, то значит это уже от лукавого.
А по теме ты что-нибудь написал?
Смотрим топик:
Недавно начал изучать С++ и возник такой вопрос:
Наверное, двух явных указаний языка программирования явно не достаточно.
P.S. Кстати, ради смеха назови "все производные от С языки" или хотя бы несколько. И каких из них касается эта тема?
Нет, неправда. Первый более-менее полезный пример, имеющий отношение к языку С. Если ты сможешь привести ещё что-то, то пожалуйста. Я думаю, каким бы пример не был сложным, но если он будет написан на С, то я пойму, что к чему.
[quote=Green]А по теме ты что-нибудь написал?
Смотрим топик:
Недавно начал изучать С++ и возник такой вопрос:
Наверное, двух явных указаний языка программирования явно не достаточно.[/quote]Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++. А всё почему? Потому что такие как ты дурят голову начинающим и создают у них впечатление, как будто кроме объектно-ориентированного стиля ничего стоящего в программировании нет. Конструкции же, которые он попросил прокомментировать, вполне применимы и в "плоском" С, поэтому моё вмешательство в разговор считаю вполне правомерным.
[quote=Green]P.S. Кстати, ради смеха назови "все производные от С языки" или хотя бы несколько. И каких из них касается эта тема?[/QUOTE]Пожалуйста, смех - это хорошо. Сам люблю постебаться и против стороннего стёба ничего против не имею. Только я ж говорю: не специалист я, поэтому что бы ни сказал, мне всё будет простительно. А языки эти, вот они: С с классами, C++, C-- и С#. Насколько эта тема касается последнего из них, честно говоря, не знаю.
Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++.
Новичек не новичек, а если такой вопрос задал то уже видно что старается понять проблему изнутри, а не то что некоторые дальше собственного носа не смотрят и ООП и шаблони ненужными считают.
А куда он сейчас без етого стиля сунется ? Много найдеш заказов, скажем, на прологе ? Или ти думаеш что Джава и .НЕТ уже свое отжыли ?
Конечно он полностю отказался от С++ и сел за си потому что уверен что приемущества плюсов ему никогда не пригодятся.
Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++. А всё почему? Потому что такие как ты дурят голову начинающим и создают у них впечатление, как будто кроме объектно-ориентированного стиля ничего стоящего в программировании нет. Конструкции же, которые он попросил прокомментировать, вполне применимы и в "плоском" С, поэтому моё вмешательство в разговор считаю вполне правомерным.
И что же ты высказал, вмешавшись в разговор?
Ничего. Кроме того, что я неправ, т.к. ты знаешь C, и не знаешь С++. (Потрясающий аргумент. Ты на форуме врачей-хирургов не пробовал спорить?)
Ну очень познавательная информация. Особенно для новичков, о которых ты так "печешься".
Ну так просвети, что отвечать новичкам, задающим вопрос по C++?
Наверное следущее: "Держу пари, что ты вообще не знаешь чётких границ между С и С++. Поэтому будем говорить про Basic."
Что плохого в том, что человек, в отличие от тебя, будет разбираться в языке С++?
Наверное только одно - "в отличие от тебя".
Почему бы человеку, задающему вопрос по C++, не ответить именно про C++?
А языки эти, вот они: С с классами, C++, C-- и С#. Насколько эта тема касается последнего из них, честно говоря, не знаю.
"С с классами" - это Objective C ? Ок, принимается.
C-- - IMHO, не является производным от C.
C# - однозначно не имеет никакого отношения к C.
И того остается только Objective C и С++.
Снова фантазии. Где это я писал, что ООП и шаблоны - ненужные вещи?
[quote=Rebbit]А куда он сейчас без етого стиля сунется ? Много найдеш заказов, скажем, на прологе ? Или ти думаеш что Джава и .НЕТ уже свое отжыли ?
Конечно он полностю отказался от С++ и сел за си потому что уверен что приемущества плюсов ему никогда не пригодятся.[/QUOTE]Спор о преимуществах плюсов перед обычным С - спор философский. Очень жаль, что для тебя всё так очевидно. После твоей реплики надо бы сказать, что дальше собственного носа не смотришь именно ты. Достаточно заметить, что если бы преимущества С++ были признаны всеми, не было бы современных стандартов языка С и API Windows был бы тоже сплошь и рядом объектно-ориентированным (в конце концов, С++ тоже очень старый язык и за годы его существования эти самые "плюсы" должны были бы быть оценены по достоинству разработчиками ОС).
Ничего. Кроме того, что я неправ, т.к. ты знаешь C, и не знаешь С++.
Ты, как всегда, всё перевираешь. Ты не прав, потому что к общей теме приплёл свой С++, а обсуждались вовсе не его особенности. Вот и всё. [quote=Green]Ты на форуме врачей-хирургов не пробовал спорить?[/quote]:-))))) Ты даже не представляешь насколько близок к истине! Нет, пока не спорил, но возможно придётся. Хирургия, правда, не моя специальность, но смежная с моей.
[quote=Green]Ну очень познавательная информация. Особенно для новичков, о которых ты так "печешься".
Ну так просвети, что отвечать новичкам, задающим вопрос по C++?
Наверное следущее: "Держу пари, что ты вообще не знаешь чётких границ между С и С++. Поэтому будем говорить про Basic."[/quote]Ёрниченье чистой воды. По-моему так: спрашивают про строки - так и отвечай про строки, а если развиваешь тему, то так и пиши: вообще-то оно так-то и так-то, но вот в моём любимом-прелюбимом С++ вот так. :-) Блин, никто ж тебя ни в чём не обвиняет. Пиши, что хочешь. Но и я буду писать, что хочу, и если в чём-то буду не согласен, обязательно выскажусь, хотя бы это и не имело отношения к первоначальной теме разговора.
[quote=Green]C-- - IMHO, не является производным от C.[/quote]Странное у тебя "IMHO".
[quote=Green]C# - однозначно не имеет никакого отношения к C.[/quote]Интересно узнать, почему тогда он объединён в этой ветке с С и С++.
Полагаю в том что человек считает нужным он старается розобраться.
Я не сказал что С хуже С++. К сожаленимю действительно профан в С++ и темболее в С. Приемущества С++ вижу, уверен что и в С есть свои приемущества.
...
arr = (int*)realloc(arr, sizeof(int)*2);
Что значит "к общей теме приплел свой С++" ?
Тема была про строки в С++. Смотри топик.
А типизация - это не особенность языка С++, а его основа. Но тебе такая оплошность простительна.
Ты даже не представляешь насколько близок к истине! Нет, пока не спорил, но возможно придётся. Хирургия, правда, не моя специальность, но смежная с моей.
Тогда расскажи мне, где вы спорите. Я тоже поспорю там твоими методами.
Ёрниченье чистой воды. По-моему так: спрашивают про строки - так и отвечай про строки, а если развиваешь тему, то так и пиши: вообще-то оно так-то и так-то, но вот в моём любимом-прелюбимом С++ вот так. :-)
Спасибо за настоятельный совет.
А от куда начинать рассказывать про строки в С++?
С бейсика, с ассемблера, с явы?
Почему ты сам начал объяснять не с алгола и фортрана?
Кстати, объясни, как можно ответить про строки в С++ с точки зрения другого языка программирования? Ты сам то абсурдность своей позиции замечаешь?
Блин, никто ж тебя ни в чём не обвиняет. Пиши, что хочешь. Но и я буду писать, что хочу, и если в чём-то буду не согласен, обязательно выскажусь, хотя бы это и не имело отношения к первоначальной теме разговора.
Ну я то уже заметил, что ты любишь вписаться не в тему и высказаться не по делу.
Странное у тебя "IMHO".
Нормальное, профессиональное.
Интересно узнать, почему тогда он объединён в этой ветке с С и С++.
Не знаю, так получилось.
Ты считаешь тему форума основным доказательством происхождения C# от C? :D
...
arr = (int*)realloc(arr, sizeof(int)*2);
Фактически, это, конечно, динамический массив. Но сторого говоря... Я бы, наверное, назвать это динамическим массивом не решился. Интересно, что скажут корифеи.
[quote=Rebbit]Полагаю в том что человек считает нужным он старается розобраться.[/quote]А по-моему, ты неправильно полагаешь. Невозможно разобраться во всём. Я глубоко убеждён, что маркетинг, термоядерный синтез, высшая математика и многое другое - очень полезные вещи; как минимум, для тех, кто ими занимается. Я вполне допускаю, что всё это безумно интересно, но разобраться во всём этом меня что-то не тянет.
А по-моему, ты неправильно полагаешь. Невозможно разобраться во всём. Я глубоко убеждён, что маркетинг, термоядерный синтез, высшая математика и многое другое - очень полезные вещи; как минимум, для тех, кто ими занимается. Я вполне допускаю, что всё это безумно интересно, но разобраться во всём этом меня что-то не тянет.
Однако тянет поспорить в том, в чем разбираться не тянет. :D
...
arr = (int*)realloc(arr, sizeof(int)*2);
То, что ты приводишь это вызов функции выделения блока памяти определенного размера и перевыделение блока.
Это достаточно низкоуровневая операция с т.з. языка С++, которая ему досталась от С. Соотв-но ни о каких типах здесь вообще речи не идет. Просто блок памяти.
В C++ нет такого типа, как "динамический массив".
Можно создать массив элементов с помощью оператора new[], но специфика этого оператора такова, что он возвращает указатель на первый элемент массива, а не значение типа массив.
Т.е. налицо неявное приведение типов в процессе создания массива таким образом.
контр-вопрос: а что такое динамический массив по твоему?
да ну!? :)
Это достаточно низкоуровневая операция с т.з. языка С++, которая ему досталась от С. Соотв-но ни о каких типах здесь вообще речи не идет. Просто блок памяти.
В C++ нет такого типа, как "динамический массив".
Можно создать массив элементов с помощью оператора new[], но специфика этого оператора такова, что он возвращает указатель на первый элемент массива, а не значение типа массив.
Т.е. налицо неявное приведение типов в процессе создания массива таким образом.
а я и приводил пример из простого С. ни о каких типах я не говорил, и то что в С++ нет такого типа, как динамический массив, знаю.
а я и приводил пример из простого С. ни о каких типах я не говорил, и то что в С++ нет такого типа, как динамический массив, знаю.
Ну так и в С нет такого типа.
Динамический массив - это, в принципе, несколько ошибочное понятие. Хотя очень расхожее.
Я тоже его употребляю, когда говорю о динамическом создании массива (именно с помощью new[]).
Но к типам или к переменным это отношения не имеет.