Другие языки программирования и технологии

Что есть char* какое отличие от char[]? int *?

char* - указатель на char
отличие от char[] никакое
это если про Си

int* как ни странно - указатель на int
ВБ
Виктор Быканов
25 516
Лучший ответ
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' ...
Andrey Okomelkov
Andrey Okomelkov
61 076
Жасулан Абдыкадыр char* это константа?
char * => указатель на char ( возможен вариант, что это указатель на первый элемент массива или просто на единственную переменную )
char[] => массив char (размерность определяется в момент инициализации)

char * можно изменить прямым "переприсвоением"

char* test1="test", test2[]="word";
test1=test2;
cout<<test1<<"\n"<<test2;
Илья Юрьевич
Илья Юрьевич
76 184
char* - это указатель на данные, char [] - это сами данные (переменной длинны). Но поскольку в Си имя и адрес - это одно и то же, такие вот трюки вполне прокатывают:

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/Переполнение_стека#Большие_переменные_в_стеке
Артур Довлатян > выделить память в СТЕКе нельзя
alloca()?
Компилятор поспорит с вами, если вы отождествите char* и char[12]. Попробуйте передать char*, когда принимается, скажем 'char (&chars)[12]' - это разные типы. Да, между ними существует неявное преобразование - из char[] в char*, что будет указателем на первый элемент массива (чаще всего на первый, если говорить о простом случае).