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

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

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

char - C++

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

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

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( - C++
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot convert char* to char теперь вроде...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

Ошибка: call of overloaded 'strchr(char&, char)' is ambiguous - C++
Здравствуйте, прога почему-то ругается на функцию strchr, вот кусок кода: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

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

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

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

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

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

Добавлено через 14 минут 41 секунду
Haster,
не факт, что система поместит строку именно в данную область памяти... Все зависит от реализации.
Стандарт с тобой не согласен.
0
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
18.05.2009, 14:32 #7
а почему так работает:
C++
1
2
3
char *temp;
temp="asdf";
temp="ewewe";
а так нет:
C++
1
2
3
char *temp;
temp="asdf";
temp[0]='A';
????????????
0
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 14:57 #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;
0
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 15:00 #9
AltPeople
потому что temp - это неконстантный указатель, которому можно присваивать новые значения, в частности - адрес другой ячейки памяти, где лежит строка "ewewe", а это -
temp[0] = 'A';
обращение по адресу и запись туда значения, что в данном случае недопустимо.
собственно, неправильная уже вторая строка.

BullDogoff,
У меня работают оба варианта. Интересно - почему?
Либо система пока не заметила что ты ей подгадил , либо древний компилятор, не соответствующий стандарту.
1
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 15:07 #10
MS Visual Studio 5.0 97-го года)) Раритет
0
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 15:08 #11
Ага, жесткач.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2009, 15:08
Привет! Вот еще темы с ответами:

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’ - C++
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в этот же файл с другим расширением ...

функция возвращает массив слов, содержащихся в текстовом сообщении char* Words(char *s) - C++
Стоит такая задача: функция должна возвратить массив слов, содержащихся в текстовом сообщении char* Words(char *s) Как это можно...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.05.2009, 15:08
Ответ Создать тему
Опции темы

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