Форум программистов, компьютерный форум CyberForum.ru

указатели - C++

Восстановить пароль Регистрация
 
snr
7 / 7 / 2
Регистрация: 29.01.2012
Сообщений: 25
05.11.2012, 15:05     указатели #1
Здравствуйте!
Ребят , вы не могли бы объяснить некоторые нюансы ,связанные с указателями, недалекому человеку?
допустим:
C++
1
2
int N[10];
cout<<N;  //выведет адресат нулевого элемента,ну что-то вроде этого: 0x24ff122
допустим следующее:
C++
1
2
3
char N[]="hello";
cout<<N<<endl;   //выведет hello
cout<<*N<<endl;   //  выведет h
далее:
C++
1
2
3
char* pointer="hello";
cout<<pointer<<endl;   //выведет hello
cout<<*pointer<<endl;  //выведет h
В какое - то время напросто запомнил это. Но хочется понять логику.
так почему символьный указатель всегда строка?
почему имя символьного массива тоже строка?
или какую нибудь лит-ру посоветуйте, где это хорошо объясняется; очень буду благодарен за любой отклик.
P.S. гуглил, но ответов не нашел.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 15:07     указатели #2
Рассматривайте имя массива, как указатель на его первый элемент
snr
7 / 7 / 2
Регистрация: 29.01.2012
Сообщений: 25
05.11.2012, 15:18  [ТС]     указатели #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Рассматривайте имя массива, как указатель на его первый элемент
могу это понять с "интовым" массивом.
Но как это представить с символьным массивом ,если его имя строка?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.11.2012, 15:23     указатели #4
Цитата Сообщение от snr Посмотреть сообщение
Но как это представить ,если имя символьного массива строка?
это не так
вот это
Цитата Сообщение от snr Посмотреть сообщение
char* pointer="hello";
указатель на константную строку(она где то в памяти лежит) и имя у него(указателя) pointer
а сама строка (если не берем юникоде) то это массив char-ов в конце которого лежит 0
например вот это "hello"
будет лежать в памяти вот так
'h', 'e', 'l', 'l', 'o' ,0
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 15:24     указатели #5
Цитата Сообщение от snr Посмотреть сообщение
могу это понять с "интовым" массивом.
Но как это представить ,если имя символьного массива строка?
Дело в том, что есть перегруженные операторы <<
cout<<указатель_на_char;
вывести всю строку, начиная с адреса указатель_на_char и до символа с кодом 0;

Вот, попробуйте:
C++
1
2
    char str[5]={'H','e','l','l','o'};
    cout<<str<<endl;
В массиве str нет завершающего символа \0, поэтому после hello будет выведен весь мусор, пока не наткнется на 0
snr
7 / 7 / 2
Регистрация: 29.01.2012
Сообщений: 25
05.11.2012, 15:35  [ТС]     указатели #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Дело в том, что есть перегруженные операторы <<
cout<<указатель_на_char;
вывести всю строку, начиная с адреса указатель_на_char и до символа с кодом 0;

Вот, попробуйте:
C++
1
2
    char str[5]={'H','e','l','l','o'};
    cout<<str<<endl;
В массиве str нет завершающего символа \0, поэтому после hello будет выведен весь мусор, пока не наткнется на 0

Согласен с вами,
Но почему имя интового массива адресат в 16-й форме,
а имя символьного массива - это строка ?

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Рассматривайте имя массива, как указатель на его первый элемент
получается,что в нашем примере hello указывает на h?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 15:43     указатели #7
Цитата Сообщение от snr Посмотреть сообщение
Но почему имя интового массива адресат в 16-й форме,
а имя символьного массива - это строка ?
Перегруженный оператор <<.
cout<<(int*) - вызовется одна функция
cout<<(char*) - вызовется другая функция
cout<<(int) - тоже другая
cout<<(char)

Добавлено через 5 минут
Цитата Сообщение от snr Посмотреть сообщение
получается,что в нашем примере hello указывает на h?
hello - это просто то, что записано в памяти (коды символов).
C++
1
char str[5]={'H','e','l','l','o'};
Здесь
str[0]='H' (точнее код символа 'H')
str[1]='e'
str[2]='l'
str[3]='l'
str[4]='o'

Грубо говоря само имя массива str указывает на элемент str[0]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 15:45     указатели
Еще ссылки по теме:

C++ Написать программу сортировки через указатели на указатели
Указатели и массивы. Указатели и функции C++
Указатели на массивы. Указатели и функции C++

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

Или воспользуйтесь поиском по форуму:
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
05.11.2012, 15:45     указатели #8
Почитай здесь, многое станет понятно http://www.cyberforum.ru/blogs/18334/blog97.html
Yandex
Объявления
05.11.2012, 15:45     указатели
Ответ Создать тему
Опции темы

Текущее время: 07:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru