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

Указатели - C++

Восстановить пароль Регистрация
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
02.11.2012, 14:16     Указатели #1
например мы имеем данный кусок кода
C++
1
2
3
4
5
6
char str[]="eto prostoi test";
    char *start;
    start=str;
    cout<<start;
    *start='b';
    cout<<start;
Первоначальный cout выводит всю строку. То есть по идее start ссылается на весь массив.
Но когда мы переменной в данном указателе присваиваем b изменяется только первый символ из строки.
Получается start ссылался на первый символ в массиве.
И как так получилось? Указатель не меняли, а он указывает в одном случае на массив символов, а во втором случае на один символ.
первый cout выводит eto prostoi test
второй cout выводит bto prostoi test
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Петр1
 Аватар для Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
02.11.2012, 14:24     Указатели #2
Во втором случае ты работаешь с указателем на массив и *start указывает на 0-й элемент, если ты сделаешь вот так
C++ (Qt)
1
*start++='b';
то получишь ebo prostoi test
Rexer
 Аватар для Rexer
151 / 150 / 19
Регистрация: 10.10.2010
Сообщений: 691
02.11.2012, 14:27     Указатели #3
Все правильно
Сначала вы выводите всю строку,так как вы создаете указатель на массив,на 0-ой элемент,но cout это метод ostream-а,поэтому он выводит вам всю строку,первый cout
Далее вы разыменовываете указатель(а он ссылается на 'e'),после этого вы присваеваете ему 'b',по сути меняете только один элемент.
и снова выводите как обычно
*(start+3) - это 'o',например,но при этом start все также указывает на 0-й элемент массива
вас запутал cout на самом деле.
Почитайте про указатели и массивы,например,у Кернигана.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
02.11.2012, 14:33  [ТС]     Указатели #4
А где ошибка в данном куске кода?

C++
1
2
3
char *end;
int len=5;
end=&(start+len-1);
Мы заставляем указатель end указывать на str[4];
Петр1
 Аватар для Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
02.11.2012, 14:36     Указатели #5
наверно
C++
1
end=&(*(start+len-1));
или все же так правильнее будет
C++
1
end=&start[len-1];
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
02.11.2012, 16:13     Указатели #6
Зачем мудрить?
C++
1
end = start+len-1;
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
03.11.2012, 00:01  [ТС]     Указатели #7
Пожалуйста, помогите ещё и с этим. После ввода обоих строк выскакиеват еррор.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char str_array[2][80],*p1,*p2;
    cout<<"Vvedite 1 stroky: ";
    gets(str_array[0]);
    p1=str_array[0];
    cout<<"Vvedite 2 stroky: ";
    gets(str_array[1]);
    p2=str_array[1];
    while(*p1){
        if(isupper(*p1)) tolower(*p1);
        p1++;
    }
    while(*p2){
        if(isupper(*p2)) tolower(*p2);
        p2++;
    }
    if(!strcmp(str_array[0],str_array[1])) cout<<"Stroki ravni!!!\n";
    else cout<<"Stroki ne ravni!!!\n";
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2012, 05:57     Указатели
Еще ссылки по теме:

C++ Написать программу сортировки через указатели на указатели
Указатели и массивы. Указатели и функции C++
Указатели на массивы. Указатели и функции C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 05:57     Указатели #8
Цитата Сообщение от kebal Посмотреть сообщение
После ввода обоих строк выскакиеват еррор.
Когда русские вводите?
C++
1
2
3
4
...
if(isupper((unsigned char)*p1)) tolower((unsigned char)*p1);
...
if(isupper((unsigned char)*p2)) tolower((unsigned char)*p2);
Yandex
Объявления
03.11.2012, 05:57     Указатели
Ответ Создать тему
Опции темы

Текущее время: 01:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru