Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2010, 16:27   #1
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
Злость Указатели

У меня вопрос по существу самих указателей.

char *c; - строка.
Вопрос: Почему это строка?
Ответ: На мой взгляд потому, что у всех массивов первый элемент есть указатель на этот массив, т.е. чтобы задать массив нужно просто указать на первый элемент, что я и сделал.

Это верно?

Далее, немного о двух базовых операциях указателей:
* - получаем значение переменной на которую ссылаемся
& - получаем адресс переменной.

Тогда по идее,
char *c = "Hello, world!";
printf("%s\n", *c); просим его распечатать значение переменной на которую ссылается указатель c.
Но этот код работать не будет, работать он будет, если написать так:

printf("%s\n, c);

Что само по себе странно, ведь мы просим распечатать сам указатель, значит форматный вывод должн быть %p, но работает именно так.

Кто мне объяснит неведомую для меня логику? Почему второй вариант компилятор принимает, а первый бракует?

Заранее спасибо!
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 04.02.2010, 16:38   #2
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от IceBreaker Посмотреть сообщение
У меня вопрос по существу самих указателей.

char *c; - строка.
Это указатель на элемент типа char. Строка - это массив, состоящий из элементов типа char, заканчивающийся нулевым символом - конца строки.
В данном случае c может указывать на первый элемент массива и тогда он будет адресовать строку.

Код:
Тогда по идее,
char *c = "Hello, world!";
printf("%s\n", *c); просим его распечатать значение переменной на которую ссылается указатель c.
Но этот код работать не будет, работать он будет, если написать так:

printf("%s\n, c);
Ничего странного нет. Здесь
Код:
printf("%s\n", *c);
Upd. %s - говорит о том, что ты собираешься вывести строку. А сам на вывод подаешь символ.

а здесь

Код:
printf("%s\n, c);
ты выводишь строку и передаешь на вывод указатель на строку. Все логично.
Быть радикальным - значит понять вещь в её корне. К.Маркс

Последний раз редактировалось nazavrik; 04.02.2010 в 17:49.
nazavrik вне форума Ответить с цитированием
Старый 04.02.2010, 16:46   #3
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

Цитата:
%s - говорит о том, что ты собираешься вывести строку. А сам на вывод подаешь адрес.
Получается, что команда * - это запрос не значения переменной на которую ссылается указатель, а запрос её адреса?
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 04.02.2010, 17:18   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от IceBreaker Посмотреть сообщение
Получается, что команда * - это запрос не значения переменной на которую ссылается указатель, а запрос её адреса?
Это операция разыменования...
Если я помог вам - порадуйте меня, нажмите на весы слева

Последний раз редактировалось RoS; 04.02.2010 в 17:22.
RoS вне форума Ответить с цитированием
Старый 04.02.2010, 17:31   #5
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

Цитата:
Это операция разыименования...
Ну уж нет. Разыменование - это получение значения на которое указывает указатель и если бы это было так, то
printf("%s\n", *c); работало бы. А оно не работает, т.к. мы туда вводим не значение переменной, а значение указателя.
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 04.02.2010, 17:34   #6
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от IceBreaker Посмотреть сообщение
Получается, что команда * - это запрос не значения переменной на которую ссылается указатель, а запрос её адреса?
Так, я загнался. Ты объявляешь указатель:

Код:
char *c;
Значением указателя является адрес, который указывает на область памяти (в это случае размерности char).

Код:
printf("%s\n", *c);
В этом случае ты указываешь, что нужно вывести строку, а на вывод передаешь символ, на который указывает указатель. Так должно работать:

Код:
printf("%с\n", *c);
Операция разыменовывания позволяет с помощью указателя оперировать непосредственно значением, содержащимся по адресу.
Быть радикальным - значит понять вещь в её корне. К.Маркс

Последний раз редактировалось nazavrik; 04.02.2010 в 17:50.
nazavrik вне форума Ответить с цитированием
Старый 04.02.2010, 17:36   #7
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от IceBreaker Посмотреть сообщение
Ну уж нет. Разыменование - это получение значения на которое указывает указатель и если бы это было так, то
printf("%s\n", *c); работало бы. А оно не работает, т.к. мы туда вводим не значение переменной, а значение указателя.
Ну ты и тугой...ПОйми уже - *c - это получение первого символа массива с, а в принтфе ты пишешь "%s", он ждет от тебя строку, а не символ, замени на %c в таком случае и радуйся первому символу.
Так вот - строка в языке С - это массив символов, оканчивающийся нулем!
Как его передать в функцию? три способа, вот :

просто имя, с
с пустыми скобками с[]
или со значением с[40] //40 символов типа

ОНИ Эквивалентны, понял?!
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 04.02.2010, 17:47   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2IceBreaker
кина про Митника насмотрелся? (я про ник)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 04.02.2010, 17:55   #9
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Ну ты и тугой...ПОйми уже - *c - это получение первого символа массива с, а в принтфе ты пишешь "%s", он ждет от тебя строку, а не символ, замени на %c в таком случае и радуйся первому символу.
Так вот - строка в языке С - это массив символов, оканчивающийся нулем!
Как его передать в функцию? три способа, вот :

просто имя, с
с пустыми скобками с[]
или со значением с[40] //40 символов типа

ОНИ Эквивалентны, понял?!
Следи за своим языком, знаток... Да, понял.

Всем спасибо большое за пояснения!

P.S. Про митника кина не смотрел.
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 05.02.2010, 09:11   #10
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

ПРосто ты, айсбрекер, построил заведомо неверную логическую цепочку, которая опровергает факт (про назначение операции *), и ты сам знаешь, что она явно ложная, но продолжаешь ее выдвигать, потому что опровергнуть не могут...
Это как если я скажу, что квадрат круглый! Опровергните, плз
А пока я буду это утверждать
Это нервирует

Так что без обид, я не хотел обидеть, форум кишит людьми, у которых такие вопросы даже родиться не могут, так что признаю свою ошибку
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели papochka Общие вопросы C/C++ 2 14.11.2009 22:06
Указатели Mighty Помощь студентам 1 24.10.2009 18:01
Указатели olli Общие вопросы C/C++ 3 20.05.2009 19:40
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39