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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
AnreyKazakov
Заблокирован
#1

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

10.09.2012, 15:05. Просмотров 1579. Ответов 18
Метки нет (Все метки)

Понемногу мозги закипают, сижу разбираюсь с указателями, вот наваял пример, но в моем понимании, на экран должен вылазить символ, а выходит строка....
вот код
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
. Но первый вариант не работает, компилятор как будто думает что массив из чаров сам является указателем....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели, почему выводится строка вместо символа? (C++):

Почему вместо 2 выводится белеберда? - C++
// mamalclass.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Почему лишний раз выводится строка? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; using namespace std; int main() { ...

Программа реверса строки: почему на экран выводится мусор, вместо нужного текста? - C++
Пишу программу реверса строки (меняет местами первый символ и последний, второй и предпоследний и т.д.). На экран выводится мусор, вместо...

Вместо 1-го символа, нужно чтобы 2 символа считывалось! - C++
#include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { char str; char c; char *word; const char delim = &quot;...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Почему выводится в виде таблицы и почему не работает сортировка - C++
почему выводится в виде таблицы? почему не работает сортировка? и как туда можно вставить классы комнат? hotel.h #include...

18
Andsteadur
153 / 137 / 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 это и есть указатель на первый элемент массива
0
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;
Выведет две строки,
0
Andsteadur
153 / 137 / 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'ов таким образом в конце не будет добавлен нуль символ. Должно вывести все символы массива, за которыми будет следовать мусор
0
David Sylva
1290 / 952 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
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;
}
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.09.2012, 15:42 #6
а вот такой массив выведется без мусора на хвосте:
C++
1
char ar[]={'a','r','r','a','y', '\0'};
0
xADMIRALx
67 / 61 / 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";
0
AnreyKazakov
Заблокирован
10.09.2012, 15:49  [ТС] #8
Да я понял, просто когда присваиваешь
C++
1
2
char ar[]={'a','r','r','a','y','\0'};
    char* i = ar;
мне казалось что значение объекта i содержит адрес первого элемента строки ar[], а *i его значение;
Но вместо адреса он выводит почему-то ересь какую-то, как тогда адрес вывести? или я вообще все перепутал?
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
10.09.2012, 15:54 #9
Да, фактически адрес. Только cout поедает тип char* как ссылку на строку
1
David Sylva
1290 / 952 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
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;
}
1
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
10.09.2012, 15:59 #11
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Andsteadur,пробуйте
C++
1
char [1] = {'1','1'};
Ошибка ? странно почму?
Где имя переменной? Это раз. И не многовато ли инициализаторов? Это два.
А вообще не пойму к чему был этот вопрос?
0
AnreyKazakov
Заблокирован
10.09.2012, 16:02  [ТС] #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Да, фактически адрес. Только cout поедает тип char* как ссылку на строку
Во, теперь все встало и село на места своя, легло даже можно сказать....
0
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
10.09.2012, 16:02 #13
AnreyKazakov, всё верно

/*мне казалось что значение объекта i содержит адрес первого элемента строки ar[], а *i его значение;*/
0
AnreyKazakov
Заблокирован
10.09.2012, 16:07  [ТС] #14
Во ,вывел теперь и адрес cout<<&i<<endl;
0x22ff44 -красивый какой был как цвет прям в RGB )
0
cmath
Модератор
2444 / 1685 / 134
Регистрация: 11.08.2012
Сообщений: 3,345
Завершенные тесты: 6
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'.
1
10.09.2012, 16:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 16:12
Привет! Вот еще темы с ответами:

Выводится 1.#INF вместо значения - C++
проблема с выводом значения v, должно быть значение в десятичной дроби , а выводится 1.#INF подскажите как исправить #include...

wchar_t. Вместо буквы выводится число - C++
Почему такой результат? #include &lt;iostream&gt; int main() { wchar_t letter=L'Z'; std::cout &lt;&lt; &quot;letter = &quot; &lt;&lt; letter &lt;&lt;...

Выводится адрес переменной, вместо ее значения - C++
Пишу программу просмотра логинов и паролей из хрома. Все работает, за исключением того, что в консоль выводятся, насколько я понял, адреса...

Использовать вместо массивов - указатели - C++
Помогите переписать, чтоб вместо массивов были показатели! #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main()...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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