Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массив символов


Автор: Dray 13.1.2006, 17:40
Код

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

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

Автор: Void 13.1.2006, 17:45
Тем, что 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

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

Автор: blackofe 13.1.2006, 20:18
Цитата(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", но это уже другая история.

Автор: threef 13.1.2006, 21:07
Массив - константный указатель

Код

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

Автор: blackofe 13.1.2006, 22:15
Цитата(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)
Массив - константный указатель

что-то я логики не нахожу. думаю, что это просто была описка.

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

# define SIZE 10

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

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


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

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

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

все верно. пардон. заблудился в терминах smile.

Автор: LuckLess 18.1.2006, 15:59
Цитата(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;

Автор: blackofe 18.1.2006, 22:26
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 ...


вызовет такую же ошибку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)