char* - указатель на char
отличие от char[] никакое
это если про Си
int* как ни странно - указатель на int
Другие языки программирования и технологии
Что есть char* какое отличие от char[]? int *?
Жасулан Абдыкадыр
А в плюсах?
Cергей Белеберда
char[] - указатель на char?
Разница в константности.
#include "iostream"
int main(){
char *s="abc", t[]="abc";
//s[0]='d';
t[0]='d';
std::cout<<s<<'\n';
std::cout<<t<<'\n';}
Тут указатель на константу и инициализированный константой массив. Попробуйте разблокировать s[0]='d' ...
#include "iostream"
int main(){
char *s="abc", t[]="abc";
//s[0]='d';
t[0]='d';
std::cout<<s<<'\n';
std::cout<<t<<'\n';}
Тут указатель на константу и инициализированный константой массив. Попробуйте разблокировать s[0]='d' ...
Жасулан Абдыкадыр
char* это константа?
char * => указатель на char ( возможен вариант, что это указатель на первый элемент массива или просто на единственную переменную )
char[] => массив char (размерность определяется в момент инициализации)
char * можно изменить прямым "переприсвоением"
char* test1="test", test2[]="word";
test1=test2;
cout<<test1<<"\n"<<test2;
char[] => массив char (размерность определяется в момент инициализации)
char * можно изменить прямым "переприсвоением"
char* test1="test", test2[]="word";
test1=test2;
cout<<test1<<"\n"<<test2;
char* - это указатель на данные, char [] - это сами данные (переменной длинны). Но поскольку в Си имя и адрес - это одно и то же, такие вот трюки вполне прокатывают:
int func(int c, char v[])
И даже так:
int func(char *v[], int c)
А вот так уже не выйдет:
int func(char j[][])
Важно понимать, что в функцию передаётся именно УКАЗАТЕЛЬ. Но компилятор делает вид, что это якобы массив. Объявить непосредственно массив данных можно только В ТЕЛЕ, передать в функцию - только в форме указателя.
int func(int c, char v[])
И даже так:
int func(char *v[], int c)
А вот так уже не выйдет:
int func(char j[][])
Важно понимать, что в функцию передаётся именно УКАЗАТЕЛЬ. Но компилятор делает вид, что это якобы массив. Объявить непосредственно массив данных можно только В ТЕЛЕ, передать в функцию - только в форме указателя.
Чо случилось с ответами??
Не заходил толком пол года, и непонятно что отвечают...
Типы данных (type) отличаются способом хранения (обычным и с плавающей точкой) и количеством байт (char - 1, int - 4(32разрядный если))
[] - называется "оператор индексации"
В синтаксисе вида type var[N];
оператор индексации говорит компилятору считать переменную константному указателем, и выделить память В СТЕКЕ (!!) размера N*sizeof(*var).
при синтаксисе вида type var[] = "xxxx"; / type var[] = {1,2,3,4};
Выделяется память, записываются данные, и присваевается указатель на первый элемент этих данных.
При записи type *var;
Создаётся просто указатель.
К которому можно приcвоить другой указатель, хоть со СТЕКА хоть из КУЧИ.
Выделяя память под него с помощью функций, типа malloc или new выделяется память в КУЧЕ, выделить память в СТЕКе нельзя. Ибо он полностью под управлением компилятора.
основное отличие в том, что нельзя для указателей созданных автоматически сделать так:
char a[] = "yyy";
char b[] = "xxx";
a = b;
но если так, то можно
char *x;
x = a;
И ещё стек ограничен по памяти, почитай https://ru.wikipedia.org/wiki/Переполнение_стека#Большие_переменные_в_стеке
Не заходил толком пол года, и непонятно что отвечают...
Типы данных (type) отличаются способом хранения (обычным и с плавающей точкой) и количеством байт (char - 1, int - 4(32разрядный если))
[] - называется "оператор индексации"
В синтаксисе вида type var[N];
оператор индексации говорит компилятору считать переменную константному указателем, и выделить память В СТЕКЕ (!!) размера N*sizeof(*var).
при синтаксисе вида type var[] = "xxxx"; / type var[] = {1,2,3,4};
Выделяется память, записываются данные, и присваевается указатель на первый элемент этих данных.
При записи type *var;
Создаётся просто указатель.
К которому можно приcвоить другой указатель, хоть со СТЕКА хоть из КУЧИ.
Выделяя память под него с помощью функций, типа malloc или new выделяется память в КУЧЕ, выделить память в СТЕКе нельзя. Ибо он полностью под управлением компилятора.
основное отличие в том, что нельзя для указателей созданных автоматически сделать так:
char a[] = "yyy";
char b[] = "xxx";
a = b;
но если так, то можно
char *x;
x = a;
И ещё стек ограничен по памяти, почитай https://ru.wikipedia.org/wiki/Переполнение_стека#Большие_переменные_в_стеке
Артур Довлатян
> выделить память в СТЕКе нельзя
alloca()?
alloca()?
Компилятор поспорит с вами, если вы отождествите char* и char[12]. Попробуйте передать char*, когда принимается, скажем 'char (&chars)[12]' - это разные типы. Да, между ними существует неявное преобразование - из char[] в char*, что будет указателем на первый элемент массива (чаще всего на первый, если говорить о простом случае).
Похожие вопросы
- C++ как переменную (signed int) разделить на старший и младший байт, а после записать в 2е другие переменные типа char?
- C++ Про выбор типа данных. Int, char и т. д.
- C++ весь код находится внутри int main(int argc, char* pszArgs[]) { }
- Как в С++ правильно преобразовать массив char в int?Как подправить код?
- с++ внутри. Как из int преобразовать в char и *char и обратно. И есть ли аналог функций switch(a) где a не char a int?
- Как в Visual C++ 2008 express перевести тип int в string или char?
- [C++] char && char* && char[ ]
- c++ возврат char из функции
- C++, вывод char в file.
- Вывести название массива с помощью char, C++