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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 00:35   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Логика работы с указателями.

Приветствую , товарищи)) Доброго времени суток )

Прошу разрешить мои сомнения разумными доводами по поводу -
общего смысла в двух кусках кода с указателями -
1) -
Код:
char s ;
      char *p = &s;
// получили указатель на с и присвоили его p - всё понятно.
2)
Код:
char* p="srgsekjrng jnlkregnrjg   rg";
вопрос - почему же не -

Код:
char* p= &"srgsekjrng jnlkregnrjg   rg";
?????
Заранее благодарю за ответы))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 10.12.2010, 02:07   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Потому что в C/C++ массив в плане семантики тождественен указателю на свой первый элемент. Массив элементов типа T (например, char - а такой массив является строкой) тождественен указателю на первый элемент этого массива - типу T* (например, char*).
Поэтому строка имеет тип char*, массив целых чисел - тип int* и т.д. и т.п.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 13.12.2010, 12:24   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
Потому что в C/C++ массив в плане семантики тождественен указателю на свой первый элемент.
Это-то да)
но -
получение указателя на переменную (область памяти ,переменной занимаемую )
происходит так -
Код:
char *p = &s;
в то же время
Цитата:
"srgsekjrng jnlkregnrjg rg"
- условно говоря - значение переменной (занимает область памяти)
да - подразумевается указатель на первый элемент (если это строка) -
но определению " получения адреса" (char *p = &s )
выражение -
Код:
char* p= &"srgsekjrng jnlkregnrjg   rg";
не соответствует )
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 13.12.2010, 12:51   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что строка "чето там" уже имеет тип char*, а ты пытаешься получить char**.
но, этому двойному указателю не куда указывать, ибо у тебя нет переменной типа char* там.
это получается по сути так, но при простом взятии адреса переменной c, нету ведь, и в итоге адрес чего хочешь взять?)
Код:
const char* c="srgsekjrng jnlkregnrjg   rg";
char** p=&c;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 12:53   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2vedro-compota
хотя нет, я ошибся. строковый литерал это статический массив, а значит от него можно брать адрес.

2Пепел Феникса
ты тоже ошибся
Цитата:
потому что строка "чето там" уже имеет тип char*
строка "чегототам" имеет тип char[10]. а строка "123" тип char[3]. и тд. но т.к имя массива = адресу первого элемента, то можно писать так
Код:
char mass[] = "12345";
char *p = mass;
или так
Код:
const char *p = "12345"; // имя массива тут опущено, но смысл тот же. это статический read only массив
и адрес от него брать можно. но не указатель на указатель, а указатель на статический массив!

Код:
const char (*p)[4] = &"123";
printf("%s\n", *p);
вот и все
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; 13.12.2010 в 13:07.
pproger вне форума Ответить с цитированием
Старый 13.12.2010, 13:06   #6
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Код:
char c;
char *p = &c;
Тут мы создаем указатель на тип char и присваеваем ему значение указателя на переменную с.
Код:
char* p= "srgsekjrng jnlkregnrjg   rg";
А вот тут происходит инициаллизация константной строки символов. Это не присваивание, поэтому это выражение и предыдущее по сути совсем разные вещи.
V0id вне форума Ответить с цитированием
Старый 13.12.2010, 13:31   #7
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

pproger? я опять ничего не понял - то есть так можно -

Код:
const char (*p)[4] = &"123";
???
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 13.12.2010, 13:33   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2vedro-compota
да.

это абсолютно аналогично
Код:
char str[4] = "123";
char (*p)[4] = &str;
только в твоем случае, у тебя указатель на констатный массив
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 вне форума Ответить с цитированием
Старый 13.12.2010, 17:37   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
... а строка "123" тип char[3]...
Поправочка, строка "123" имеет тип char[4]
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.12.2010, 17:53   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Blade
виновен по всем статьям
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 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
“Иследование работы с указателями ” saammy Общие вопросы C/C++ 2 24.10.2015 17:49
Логика evklid Помощь студентам 2 28.10.2010 12:51
Каков принцип работы с указателями??? Tanusha_221 Помощь студентам 0 28.05.2010 16:12
Логика работы приложения WINDOWS? образами...:) robototechnik Общие вопросы C/C++ 3 18.03.2010 13:58
работы с указателями и массивами... Катюшенька Помощь студентам 21 24.01.2009 12:17