Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив символов, и строка 
V
    Опции темы
Dray
  Дата 13.1.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Код

char p1[] = "Массив символов";
char *p2 =  "Строка";

Чем отличаются указатели p1 и p2?


--------------------
忍者

user posted image
PM MAIL   Вверх
Void
Дата 13.1.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Тем, что p1 - это не указатель, а массив определенного размера. Просто он, как и любой массив в C++ может быть неявно преобразован в указатель. И убедиться в этом очень просто:
Код
#include <stdio.h>

int main() {
    char p1[] = "Hello, world!";
    char *p2 = "Hello, world!";
    printf("sizeof(p1) = %u, sizeof(p2) = %u", sizeof(p1), sizeof(p2));
    return 0;
}

Цитата
sizeof(p1) = 14, sizeof(p2) = 4



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
nikitao
Дата 13.1.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



В том что char *p2 является константой,а p1 просто массив символов

Это сообщение отредактировал(а) nikitao - 13.1.2006, 18:00


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
blackofe
Дата 13.1.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(nikitao @ 13.1.2006, 17:59)
В том что char *p2 является константой,а p1 просто массив символов

не понял. с какой радости p2 является константой? вот такой код компилер откомпилит, а программа выполнится и не поперхнется:

Код

#include <stdio.h>

int main()
{
    char *p2 = "Hello, world!";

    p2++;

    p2 = "Good bye, world!";

    return 0;
}


а если ты имеешь в виду, что нельзя писать вот так

Код

p2[0] = 'q';


то это не называется константой. и компилятор это опять же проглотит спокойно. другое дело, что в процессе выполнения ты получишь "access violation", но это уже другая история.
PM MAIL   Вверх
threef
Дата 13.1.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Массив - константный указатель

Код

char p[]="ab";
char *q="ab";
q++;// ok
p++;// ошибка компиляции
p[0]='с';// ок
q[0]='c';// ошибка выполнения

PM MAIL   Вверх
blackofe
Дата 13.1.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Dray @ 13.1.2006, 17:40)
Код

char p1[] = "Массив символов";
char *p2 =  "Строка";


Цитата(nikitao @ 13.1.2006, 17:59)
В том что char *p2 является константой,а p1 просто массив символов


Цитата(threef @ 13.1.2006, 21:07)
Массив - константный указатель

что-то я логики не нахожу. думаю, что это просто была описка.
PM MAIL   Вверх
Helicopterr
Дата 14.1.2006, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



Нет не описка. Массив - это указатель - константа на адрес первого элемента. Оператор [] может и не использоваться. Например
Код

# define SIZE 10

int  integerA [SIZE]; //массив
int  *piTemp; //указатель

//Вполне допустимо:
piTemp =  integerA;
//или то же самое:
piTemp =  &integerA[0];
//Но бессмысленно:
integerA = piTemp;
&integerA[0] = piTemp;
//Т.к. это все равно что:
10 = piTemp;


Надеюсь теперь разница понятна.


--------------------
people can fly
PM MAIL   Вверх
threef
Дата 14.1.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



blackofe
Константа - это то, что не меняется в процессе работы программы. Константный указатель - это константа, содержащая адрес. Этот адрес не может меняться. Указатель на строку - это указатель на КОНСТАНТУ. Сам указатель может меняться, а вот строка - нет. Да пример-то попробуй!

PM MAIL   Вверх
blackofe
Дата 17.1.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(threef @ 14.1.2006, 14:10)
blackofe
Константа - это то, что не меняется в процессе работы программы. Константный указатель - это константа, содержащая адрес. Этот адрес не может меняться. Указатель на строку - это указатель на КОНСТАНТУ. Сам указатель может меняться, а вот строка - нет. Да пример-то попробуй!

все верно. пардон. заблудился в терминах smile.
PM MAIL   Вверх
LuckLess
Дата 18.1.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Цитата(Helicopterr @ 14.1.2006, 04:35 Найти цитируемый пост)
Нет не описка. Массив - это указатель - константа на адрес первого элемента.

Не совсем так. Массив - непрерывная область памяти содержащая элементы типа T , следующие друг за другом.
Имя массива - константный указатель на первый элемент массива.
Цитата(threef @ 14.1.2006, 14:10 Найти цитируемый пост)
Указатель на строку - это указатель на КОНСТАНТУ.

Это с чегойто вдруг..?
Смотря что щитать строкой.
Если строкой щитать массив символов оканчивающихся '\0' то твое утверждение неверно..
попробуй.
Код

char a[]="zaza";
char* b = a; //b- указатель на строку.
b[0]='k';//все ок.
std::cout << b << "\n" <<a;


Это сообщение отредактировал(а) LuckLess - 18.1.2006, 16:09
PM MAIL   Вверх
blackofe
Дата 18.1.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



LuckLess, имеется в виду конкретный пример:

Код

char *p2 = "Hello, world!";


здесь "Hello, world!" - строковая константа, а p2 - указывает на нее. и

Код

p2[0] = 'a';


вызовет ошибку выполнения 'access violation', поскольку будет выполнена попытка записи в константную строку. более того, вот такой код

Код

    char *p = "1234567890";
    char *pp = p;
    pp[0] = 'q';   // Access violation writing location ...


вызовет такую же ошибку.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.