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

Указатели, почему выводится строка вместо символа? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
AnreyKazakov
Заблокирован
10.09.2012, 15:05     Указатели, почему выводится строка вместо символа? #1
Понемногу мозги закипают, сижу разбираюсь с указателями, вот наваял пример, но в моем понимании, на экран должен вылазить символ, а выходит строка....
вот код
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
int main(){
    using std::cout;
    using std::endl;
    using std::string;
    char ar[]={'a','r','r','a','y'};
    char* i = ar;
    cout<<i<<endl;
    return 0;
    }
Еще и символы какие-то, в общем на выходе вот что:
arrayG "
Кто знает, в чем фокус???

Добавлено через 3 минуты
В принципе вообще присваивать надо как
C++
1
char* i = &ar
, а не
C++
1
char* i = ar
. Но первый вариант не работает, компилятор как будто думает что массив из чаров сам является указателем....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
10.09.2012, 15:21     Указатели, почему выводится строка вместо символа? #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    using std::cout;
    using std::endl;
    char ar[]={'a','r','r','a','y'};
    char* i = ar;
    cout<<*i<<endl; //разыменовываем
    return 0;
}
И да ar это и есть указатель на первый элемент массива
Mindz
 Аватар для Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
10.09.2012, 15:23     Указатели, почему выводится строка вместо символа? #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;                 
 
 
int main()
{
    
    char ar[]={'a','r','r','a','y'};
    char* i = ar;
    
    cout << *i << endl;  
         
    system( "pause" );
    
    return 0;        
}
Так выводит первый символ.
Ниже приведенные части кода идентичны,пища для размышления
C++
1
2
3
4
5
6
7
    
    char String[] = "Test String";
    
    char *String_Point = "POinter String";
 
    cout << String << endl
          << String_Point << endl;
Выведет две строки,
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
10.09.2012, 15:28     Указатели, почему выводится строка вместо символа? #4
И вообще
C++
1
2
3
char ar[]={'a','r','r','a','y'};
    char* i = ar;
    cout<<i<<endl;
должно выводить какую-то фигню, т.к. при инициализации массива char'ов таким образом в конце не будет добавлен нуль символ. Должно вывести все символы массива, за которыми будет следовать мусор
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
10.09.2012, 15:31     Указатели, почему выводится строка вместо символа? #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
int main(){
    using std::cout;
    using std::endl;
    using std::string;
 
    char ar[]={'a','r','r','a','y'};
    char* i = ar;
    cout<<*i<<endl; // вот так выводит символ
    return 0;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.09.2012, 15:42     Указатели, почему выводится строка вместо символа? #6
а вот такой массив выведется без мусора на хвосте:
C++
1
char ar[]={'a','r','r','a','y', '\0'};
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
10.09.2012, 15:48     Указатели, почему выводится строка вместо символа? #7
Andsteadur,пробуйте
C++
1
char [1] = {'1','1'};
Ошибка ? странно почму?

AnreyKazakov,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char *i = &ar[0];//теперь комплиятор вас понял :)
char *i = ar;//эквивалентно,но не знаю при дизасме так же или нет
 
//и когда пишите
 
cout << i  << "\n";
 
//выводит адрес в данном случии первого элемента массива ar,то есть адресс ar[0];
 
//пробуйте так
//выводит всё
cout << *i << "\n";
 
 
 
//2 элемент
cout << i[1] << "\n";
 
 
//эквивалент
cout << *(i+1) << "\n";
AnreyKazakov
Заблокирован
10.09.2012, 15:49  [ТС]     Указатели, почему выводится строка вместо символа? #8
Да я понял, просто когда присваиваешь
C++
1
2
char ar[]={'a','r','r','a','y','\0'};
    char* i = ar;
мне казалось что значение объекта i содержит адрес первого элемента строки ar[], а *i его значение;
Но вместо адреса он выводит почему-то ересь какую-то, как тогда адрес вывести? или я вообще все перепутал?
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
10.09.2012, 15:54     Указатели, почему выводится строка вместо символа? #9
Да, фактически адрес. Только cout поедает тип char* как ссылку на строку
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
10.09.2012, 15:56     Указатели, почему выводится строка вместо символа? #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
int main(){
    using std::cout;
    using std::endl;
    using std::string;
 
    char ar[]={'a','r','r','a','y'};
    char* i = ar;
    cout<<&i<<endl; // адрес
    return 0;
}
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
10.09.2012, 15:59     Указатели, почему выводится строка вместо символа? #11
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Andsteadur,пробуйте
C++
1
char [1] = {'1','1'};
Ошибка ? странно почму?
Где имя переменной? Это раз. И не многовато ли инициализаторов? Это два.
А вообще не пойму к чему был этот вопрос?
AnreyKazakov
Заблокирован
10.09.2012, 16:02  [ТС]     Указатели, почему выводится строка вместо символа? #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Да, фактически адрес. Только cout поедает тип char* как ссылку на строку
Во, теперь все встало и село на места своя, легло даже можно сказать....
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
10.09.2012, 16:02     Указатели, почему выводится строка вместо символа? #13
AnreyKazakov, всё верно

/*мне казалось что значение объекта i содержит адрес первого элемента строки ar[], а *i его значение;*/
AnreyKazakov
Заблокирован
10.09.2012, 16:07  [ТС]     Указатели, почему выводится строка вместо символа? #14
Во ,вывел теперь и адрес cout<<&i<<endl;
0x22ff44 -красивый какой был как цвет прям в RGB )
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
10.09.2012, 16:12     Указатели, почему выводится строка вместо символа? #15
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
но в моем понимании, на экран должен вылазить символ, а выходит строка....
Работа с "числовыми" и "символьными" типами идет по-разному
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
 
int main()
{
 
int *n;
n = new int[9];
cout << n << endl;
delete []n;
system("pause");
return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
 
int main()
{
 
char *n;
n = new char[9];
cout << n << endl;
delete []n;
system("pause");
return 0;
}
в первом случае программа выдаст адрес первого элемента, во втором же будет выводить все символы, пока не упрется в '\0'.
AnreyKazakov
Заблокирован
10.09.2012, 16:20  [ТС]     Указатели, почему выводится строка вместо символа? #16
Цитата Сообщение от Hydrogen Посмотреть сообщение
Работа с "числовыми" и "символьными" типами идет по-разному
В моем понимании вывод только идет по разному или нет?
Да, а когда оператор инкремента применять к указателю, он получается прибавляет не единицу а размерность указателя, так?
C++
1
2
3
4
5
6
const char ca[] = {'h','e','l','l','o','\0'};
const char *cp=&ca[0];
    while(*cp){
        std::cout<<*cp<<std::endl;
        ++cp;
        }
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
10.09.2012, 16:24     Указатели, почему выводится строка вместо символа? #17
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
В моем понимании вывод только идет по разному или нет?
Да, а когда оператор инкремента применять к указателю, он получается прибавляет не единицу а размерность указателя, так?
Только вывод по-разному. Когда прибавляешь к указателю число - самому указателю прибавляется число умножить на размер того, на что он указывает.
Честно говоря я точно не знаю точно, но либо у std::cout перегружен operator<< для случая char*, либо срабатывает неявный вызов конструктора std::string, который как известно умеет принимать char*
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
10.09.2012, 16:25     Указатели, почему выводится строка вместо символа? #18
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Да, а когда оператор инкремента применять к указателю, он получается прибавляет не единицу а размерность указателя, так?
Указатель смещается на sizeof(T) байт относительно текущей позиции. Где Т - тип значения, на которое указывает указатель.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 08:29     Указатели, почему выводится строка вместо символа?
Еще ссылки по теме:

C++ Не выводится строка через cout
Выводится лишняя строка из файла C++
C++ Почему выводится в виде таблицы и почему не работает сортировка

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.09.2012, 08:29     Указатели, почему выводится строка вместо символа? #19
AnreyKazakov, указатель указывает на блок в памяти, в котормо может располагаться сколько угодно однотипных данных. Сам указатель хранит только адрес начала блока, но не его размер и для работы с блоком надо как то помимо указателя получить размер блока. Потоковые операторы не имеют операндов для передачи размера и не могут выводить отдельные данные по указателям. Если потоку скормить любой другой казатель, то будет выведен сам указатель, а указатель на символ считается указателем на нультерминальную строку символов, длина которой (размер блока) определяется поиском первого нулевого символа.
Yandex
Объявления
11.09.2012, 08:29     Указатели, почему выводится строка вместо символа?
Ответ Создать тему
Опции темы

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