С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/23: Рейтинг темы: голосов - 23, средняя оценка - 4.57
67 / 67 / 24
Регистрация: 21.11.2008
Сообщений: 226
1

char

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

Author24 — интернет-сервис помощи студентам
Почему при объявлении char* t= "hello"; я не могу изменить содержимое t[1] ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2009, 10:48
Ответы с готовыми решениями:

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что "char *concat(char *,...)": невозможно...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...

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

10
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
18.05.2009, 10:54 2
Потому что создается указатель на строку, а не массив.
0
MCSD: APP BUILDER
8794 / 4073 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
Записей в блоге: 5
18.05.2009, 13:39 3
А теперь - правильный ответ

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

правильно - так:
const char* p = "...";
то есть p - это указатель на данные, лежащие в read-only области памяти.
0
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 13:49 4
Rififi, объясни поподробнее, если не трудно..
При объявлении массива
C++
1
char c[6];
c - фактически указатель на нулевой элемент, так? В чём принципиальная разница? С int у меня всё работало, изменяй - не хочу..
0
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
18.05.2009, 13:55 5
По поводу read only, то не факт, что система поместит строку именно в данную область памяти... Все зависит от реализации.
0
MCSD: APP BUILDER
8794 / 4073 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
Записей в блоге: 5
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
10 / 10 / 2
Регистрация: 25.09.2008
Сообщений: 71
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
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
MCSD: APP BUILDER
8794 / 4073 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
Записей в блоге: 5
18.05.2009, 15:00 9
AltPeople
потому что temp - это неконстантный указатель, которому можно присваивать новые значения, в частности - адрес другой ячейки памяти, где лежит строка "ewewe", а это -
temp[0] = 'A';
обращение по адресу и запись туда значения, что в данном случае недопустимо.
собственно, неправильная уже вторая строка.

BullDogoff,
У меня работают оба варианта. Интересно - почему?
Либо система пока не заметила что ты ей подгадил , либо древний компилятор, не соответствующий стандарту.
1
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
18.05.2009, 15:07 10
MS Visual Studio 5.0 97-го года)) Раритет
0
MCSD: APP BUILDER
8794 / 4073 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
Записей в блоге: 5
18.05.2009, 15:08 11
Ага, жесткач.
0
18.05.2009, 15:08
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2009, 15:08
Помогаю со студенческими работами здесь

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru