Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.97
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
#1

char - C++

18.05.2009, 10:48. Просмотров 3944. Ответов 10
Метки нет (Все метки)

Почему при объявлении char* t= "hello"; я не могу изменить содержимое t[1] ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2009, 10:48     char
Посмотрите здесь:

Преобразование char[256] в char* - C++
Как преобразовать char в char*?

E2034 Cannot convert 'char' to 'char *' - C++
Добрый день всем! Помогите плз исправить ошибку. Не понимаю чего она происходит. Вообщем, нужно все елементы строки text запихнуть в...

Копирование char* в массив char[i]* - C++
Друзья, не бейте, искал, то что нашел - не помогло. Использую WinAPI, но это не суть важно сейчас. Весь код под спойлером у меня есть...

В чем отличие char* s от char *s - C++
В чем отличие char* str; от char *str; ?

Массив char в переменную char - C++
Допустим, имеется заполненный массив char Massiv, и есть переменная char buff. Как массив передать в переменную?

Cannot convert parameter 1 from 'char' to 'char []' - C++
#include <iostream> using namespace std; const int MAX=20; class base { public: virtual char sry(char str, char s)=0; }; ...

conversion from ‘char’ to ‘const char*’ - C++
Всем добрый вечер! Я хочу выполнить команду is.open(file_name, ios::binary); но функция open требует тип const char file_name, а...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
18.05.2009, 10:54     char #2
Потому что создается указатель на строку, а не массив.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 13:39     char #3
А теперь - правильный ответ

потому что этот код неправильный и компиляторы вынуждены его поддерживать только потому, что такой кривизны понаписано очень много где.

правильно - так:
const char* p = "...";
то есть p - это указатель на данные, лежащие в read-only области памяти.
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 13:49     char #4
Rififi, объясни поподробнее, если не трудно..
При объявлении массива
C++
1
char c[6];
c - фактически указатель на нулевой элемент, так? В чём принципиальная разница? С int у меня всё работало, изменяй - не хочу..
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
18.05.2009, 13:55     char #5
По поводу read only, то не факт, что система поместит строку именно в данную область памяти... Все зависит от реализации.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 14:14     char #6
BullDogoff,
c - фактически указатель на нулевой элемент, так?
нет. с - это будет массив, имеющий тип "6 чаров"

В чём принципиальная разница?
char c[6] = "1"'
const char*p = "1";

принципиальная разница в том, что это две разные сущности в C/C++.
у этих переменных разный тип и разный размер, что подтверждают унарный оператор взятия адреса (&) и оператор sizeof.
При определенных обстоятельствах имя массива может быть неявно приведено компилятором к указателю на первый элемент:
void f(char*);
можно вызвать так: f(c), но массив от этого не превратится в указатель.

Добавлено через 14 минут 41 секунду
Haster,
не факт, что система поместит строку именно в данную область памяти... Все зависит от реализации.
Стандарт с тобой не согласен.
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
18.05.2009, 14:32     char #7
а почему так работает:
C++
1
2
3
char *temp;
temp="asdf";
temp="ewewe";
а так нет:
C++
1
2
3
char *temp;
temp="asdf";
temp[0]='A';
????????????
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 14:57     char #8
У меня работают оба варианта. Интересно - почему?
Если я объявляю указатель на тип, в нём хранится длина области памяти, занимаемой единицей данных этого типа, и адрес этой области.. Тут же впечатление такое, что в указателе на char хранится непосредственно массив char, причём динамический..

Проверил sizeof(temp) - четыре байта, как положено.. Ба-алин...
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream.h>
 
main()
{
    int* x = new int[10];
    int y[10];
 
    cout<<"x = "<<x<<";\n";
    cout<<"y = "<<y<<";\n";
 
    for (int i = 0; i<10; i++)
    {
        x[i] = 10+i;
        y[i] = 20+i;
        
        cout<<"i = "<<i<<"\n";
        cout<<"x["<<i<<"] = "<<x[i]<<"\n";
        cout<<"y["<<i<<"] = "<<y[i]<<"\n\n";
    }
 
    cout<<sizeof(x)<<" "<<sizeof(y)<<" "<<sizeof(int*)<<";\n";
 
/////////////////////////////////////////////////////////////////////////////////
 
    char* temp;
    temp="asdf";
    cout<<temp<<"  size  "<<sizeof(temp)<<"\n";
    temp="qwerty";
    cout<<temp<<"  size  "<<sizeof(temp)<<"\n";
    temp[0]='A';
    cout<<temp<<"  size  "<<sizeof(temp)<<"\n";
 
    return 0;
}
Два независимых тестовых куска кода.. Всё пашет.. sizeof(y) = 40;
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 15:00     char #9
AltPeople
потому что temp - это неконстантный указатель, которому можно присваивать новые значения, в частности - адрес другой ячейки памяти, где лежит строка "ewewe", а это -
temp[0] = 'A';
обращение по адресу и запись туда значения, что в данном случае недопустимо.
собственно, неправильная уже вторая строка.

BullDogoff,
У меня работают оба варианта. Интересно - почему?
Либо система пока не заметила что ты ей подгадил , либо древний компилятор, не соответствующий стандарту.
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 15:07     char #10
MS Visual Studio 5.0 97-го года)) Раритет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2009, 15:08     char
Еще ссылки по теме:

Разница между new char[] и new char[]() - C++
Доброго времени суток. Подскажите пожалуйста разницу, между следующим кодом: char* ch = new char; и char* ch = new...

Невозможно преобразовать char* в char - C++
Как исправить ошибку?

Char *(UTF-8) -> char *(ANSI) - C++
Есть строка в кодировке UTF-8(если не ошибаюсь) типа char * Вот так ее я вижу в MSVC++10 - комментарии(оригинал - комментарии)...

Аргумент типа char** не совместим с параметром типа const char* - C++
Программа должна позволять заносить в структуру данные и выводить на экран информацию о поездах, следующих до определенной станции: ...

написать програму void(char source[] ,char dest[]) которая скопирует все символы из source[] ,которые не принадлежат алфавиту , в dest[]. - C++
написать програму void(char source ,char dest) которая скопирует все символы из source ,которые не принадлежат алфавиту , в dest.выводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 15:08     char #11
Ага, жесткач.
Yandex
Объявления
18.05.2009, 15:08     char
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru