Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатели  (Прочитано 8554 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mitnick
Гость
« : 24-06-2005 06:53 » 

Привет всем !

Прошу объяснить мне назначение и варианты применения указателей в языке Си (или Си++). А также мне нужно знать, почему вот этот фрагмент кода выводит строку текста:

Код:
#include <stdio.h>

main()
{
    char* string = "Hello, world!";
    printf("%s",string);
}

Не понимаю, почему переменная-указатель типа char, в которой, как сказано в определении, хранится адрес какой-либо ячейки памяти, выводит строку текста   Здесь была моя ладья...
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 24-06-2005 07:17 » 

Строка - это массив символов. Что такое массив понятно? Это несколько ячеек памяти, расположенных последовательно.
К массиву можно получить доступ по его первому элементу (все остальные элементы идут за первым по порядку). Первый элемент адресуется указателем на него. То есть адрес первого элемента и хранится в указателе.
Возникает вопрос - как получить длину массива?
Вариант а. Ты хранишь длину в отдельной переменной и по ней знаешь сколько у тебя элементов.
Вариант б. Если массив содержит строку символов, как у нас, то имеется соглашение по которому в конце строки стоит символ нуля (двоичный). То есть длина массива - это все следующие за первым элементы до нуля включительно.
Функция printf() получает указатель на строку (адрес первого элемента) и выводит на экран все символы подряд до тех пор, пока не встретит нуль (двоичный).
Разница между символьным и двоичным нулем понятна, надеюсь?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
LP
Помогающий

ru
Offline Offline

« Ответ #2 : 24-06-2005 08:43 » 

Не понимаю, почему переменная-указатель типа char, в которой, как сказано в определении, хранится адрес какой-либо ячейки памяти, выводит строку текста  Здесь была моя ладья...
Выводится строка, потому что в первом параметре функции printf ты указываешь
"%s", таким образом функция считает что передаваемый указатель указывает на начало
С-строки. Так уж реализована эта функция... Если передашь параметр "%u", то получишь собственно
адрес, который хранится в переменной string, а при "%x" то же но 16-ом представлении.
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Mitnick
Гость
« Ответ #3 : 24-06-2005 19:24 » 

Спасибо всем за ответы ! Теперь более или менее я в этом разобрался, просто до этого я не знал, что функции printf() или puts() в качестве параметра передается указатель, до этого просто не додумался : - ) Но теперь возник вопрос:

Вот объявляется указатель на объект типа char, в котором по теории может храниться 1 байт. Тогда каким образом происходит следующее присваивание:
Код:
char* string = "Hello !";
? То есть компилятор, получается, автоматически при проверке этого выражения присваивает переменной-указателю string адрес нулевого элемента строки ? Я правильно понял ?
Записан
LP
Помогающий

ru
Offline Offline

« Ответ #4 : 24-06-2005 20:15 » 

Да... правильно. Если подробно, то в твоем примере компилятор сначала размещает строку "Hello !" в некоторой области памяти, завершает ее нулем (\0), а затем адрес первого элемента ('H') присваивает указателю string.
« Последнее редактирование: 20-12-2007 20:17 от Алексей1153++ » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 24-06-2005 21:47 » 

Mitnick, любой указатель, если ему писвоить адрес массива (соотв. типа), будет указывать на первый элемент.
Особенность указателей:
1) контроль типов на уровне компилятора;
2) арифметика указателей: одна единица указателя равна размеру указываемого типа с учетом выравнивания (определяется компилятором).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 25-06-2005 15:14 » 

Цитата
арифметика указателей: одна единица указателя равна размеру указываемого типа с учетом выравнивания
Добавлю от себя, дабы начинающему понятно было - если, например,  Р - это указатель на элемент массива переменных какого-либо типа, то Р+1 - это адрес следующего за ним элемента (а не просто 1 прибавленная к адресу)  Улыбаюсь
А вааще - у товарисча хороший ник... Имя не Кевин часом? Отлично (без обид, пожалуйста... никаких насмешек, просто имя известное)
« Последнее редактирование: 25-06-2005 15:18 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Mitnick
Гость
« Ответ #7 : 25-06-2005 18:06 » 

Нет, зовут меня Виктор  Улыбаюсь  Поклонник я Митника  Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines