68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
1

В чем отличие char* s от char *s

14.07.2016, 09:34. Показов 2512. Ответов 32
Метки нет (Все метки)

В чем отличие
C++
1
char* str;
от
C++
1
char *str;
?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2016, 09:34
Ответы с готовыми решениями:

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару...

В чем разница между char* и char **
в чем разница между char* и char ** ??

Чем отличается const char* от char*?
Доброго всем дня! Из матчасти я понимаю, что char* - это указатель массив символов, тогда как...

32
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
14.07.2016, 09:36 2
laby, ни в чём, можно хоть
C++
1
char * s;
писать.
0
68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
14.07.2016, 09:38  [ТС] 3
Что-то не верится. Где это написано? Блин вообще запутался, сложный язык.
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
14.07.2016, 09:41 4
laby, ну, если не верится, то можно проверить самостоятельно. Попробуйте создать программу с тремя такими объявлениями и поковыряться с ними.

Добавлено через 22 секунды
Можете ещё
C++
1
char*s;
добавить.
0
Модератор
Эксперт С++
12756 / 10218 / 6142
Регистрация: 18.12.2011
Сообщений: 27,364
14.07.2016, 09:42 5
Дело вкуса.
В принципе, можно в зависимости от того, где стоит звездочка, говорить:

char* str означает, что str является адресом переменной типа char

char *str означает, что при разыменавании str получим значение типа char

Я рекомендую использовать второй способ, т.к. в первом возможны накладки такого типа
C++
1
char* a, b;
b переменная типа char, а не char*
Надо все равно писать
C++
1
char* a,*b;
1
68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
14.07.2016, 09:45  [ТС] 6
А
C++
1
char& str;
и
C++
1
char &str;
тоже одно и то же?

и что это?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
14.07.2016, 09:49 7
laby, здесь тоже можно писать обоими способами.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.07.2016, 09:50 8
Вся шутка подобной расстановки знаков проявляется лишь в объявлении нескольких ссылок или указателей с помощью запятой:
C++
int *x, *y, *z
C++
int* x,* y,* z
C++
int * x, * y, * z
Типа можно ошибиться и подумать, что следующая запись объявит три именно указателя:
C++
int* x, y, z
Когда на самом деле здесь только x указатель, а y и z переменные.
Поэтому и пишут звездочку рядом с переменной, а не с типом, чтобы понимать что она относится не ко всему типу, а только к одной переменной.
1
Модератор
Эксперт С++
12756 / 10218 / 6142
Регистрация: 18.12.2011
Сообщений: 27,364
14.07.2016, 09:50 9
Это ссылка на переменную (или синоним переменной).
Так, как Вы написали, писать нельзя: ссылку нужно сразу же инициализировать.
C++
1
2
3
4
сhar a;
char& str=a;
str='b';
cout<<a;// выводится b
0
68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
14.07.2016, 10:19  [ТС] 10
что еще за ссылка?

Добавлено через 5 минут
То есть это не взятие адреса?

Добавлено через 5 минут
* это объявление указателя и вместе с тем разыменовывание этого указателя
& это объявление ссылки и вместе с тем взятие адреса
запутали одно и то же для разных вещей. Еще бы понять физически как формируется эта ссылка. Это новое в памяти или то же. Судя по всему то же. А зачем оно нужно. Ну в процедурах понятно для передачи параметра чтоб его можно было там изменить. А вот при описании переменной зачем. И опять же в процедурах можно ведь передавать указатель. Зачем этот &.
0
Модератор
Эксперт С++
12756 / 10218 / 6142
Регистрация: 18.12.2011
Сообщений: 27,364
14.07.2016, 10:39 11
Цитата Сообщение от laby Посмотреть сообщение
что еще за ссылка?
Повторюсь - это синоним переменной.
Удобно его использовать при передаче параметров
C++
1
2
3
4
5
6
7
8
9
10
11
12
void swap(int& a,int& b)
{
   int t=a;
   a=b;
   b=t;
}
int main()
{
    int x=1,y=2;
    swap(x,y); // a становится синонимом x, b - синонимом y
    cout<<x<<' '<<y;  // выводится 2 1
}
0
4 / 4 / 1
Регистрация: 20.01.2016
Сообщений: 24
14.07.2016, 10:41 12
laby, чтобы примерно понимал, приведу неправильный пример из реальной жизни. В разговорных языках бывает несколько слов означающие одно и тоже, зовутся такие слова синонимами. Так вот ссылка - почти тот же синоним, только в C, C++ она получает адрес памяти другой переменной. То что будет записано в этой области памяти, то и будешь получать со всех переменных, которые имеют доступ к этой самой области памяти.
Пример такой:
C++
1
2
3
4
5
6
    int a = 0;
    int &b = a;
    cout << a << endl; // 0
    b = 5;
    cout << a << endl; // 5
    cout << b << endl; // 5
Переменная 'b' получила адрес памяти переменной a, следующей строкой (b = 5) я записал в этот адрес значение 5. Так как адрес у переменной 'a' и 'b' один и тот же, то и значения одинаковые (когда выполнилось b = 5, то и 'a' стала значением 5).
* - указатель на адрес.
& - ссылка на адрес.

Добавлено через 1 минуту
Кстати, как указал zss, то при передаче параметнов это очень хороший способ использовать ссылки, дабы не выделять дополнительно память.
0
68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
14.07.2016, 11:45  [ТС] 13
Ну всё равно сложно. Наверное так:
* - адрес адреса переменной.
& - адрес переменной.
0
Модератор
Эксперт С++
12756 / 10218 / 6142
Регистрация: 18.12.2011
Сообщений: 27,364
14.07.2016, 11:59 14
Не путайте использование амперсанда в операции взятия адреса и в объявлении ссылки.
Считайте, что это РАЗНЫЕ знаки.
C++
1
2
3
int a;
int *pa=&a; // взятие адреса
int &ri=a;// объявление ссылки(синонима)
0
804 / 531 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.07.2016, 12:14 15
laby, ипользование знака (&) и (*) зависит от контекста их применения, как уже написал zss
0
4 / 4 / 1
Регистрация: 20.01.2016
Сообщений: 24
14.07.2016, 13:27 16
zss, не накручивай себя, из-за этого тебе сложно. Мысли проще.
Адрес адреса переменной - такого нету. Если указатель на адрес. Есть ссылка.
0
Модератор
Эксперт С++
12756 / 10218 / 6142
Регистрация: 18.12.2011
Сообщений: 27,364
14.07.2016, 13:29 17
shezu, Про адрес адреса разговора не было.
0
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
14.07.2016, 13:42 18
Когда пишут
C++
1
char *s;
имеют ввиду что s является указателем на тип char

Когда пишут
C++
1
char* s;
Имею ввиду то, что s это указатель типа char.

Можно писать как угодно, как тебе удобно, как тебе кажется логичней.
Лично я пишу
C++
1
char *s;
0
68 / 4 / 1
Регистрация: 11.10.2012
Сообщений: 89
14.07.2016, 13:46  [ТС] 19
zss, не накручивай себя, из-за этого тебе сложно. Мысли проще.
Адрес адреса переменной - такого нету. Если указатель на адрес. Есть ссылка.
Это я накручиваю.
Переменная - это адрес.
Ссылка это адрес переменной, то есть адрес адреса
Указатель это адрес переменной, то есть адрес адреса
...
однако
0
804 / 531 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.07.2016, 13:51 20
Цитата Сообщение от laby Посмотреть сообщение
Указатель это адрес переменной
Обычно, указатель - это переменная, хранящая адрес.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2016, 13:51
Помогаю со студенческими работами здесь

В чем разница между char* и char[]?
Доброго времени суток, наткнулся на одну загвоздку есть такой кусок кода int _tmain(int argc,...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

Отличие char от string
Я не могу понять отличие Char от String. Эти два оператора работают со строками, а самое главное в...

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что &quot;char *concat(char *,...)&quot;: невозможно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru