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

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

Войти
Регистрация
Восстановить пароль
 
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
#1

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

13.05.2012, 14:06. Просмотров 267. Ответов 3
Метки нет (Все метки)

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
35
#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include "string"
 
using namespace std;
 
char *getname(void);
 
int _tmain(int argc, _TCHAR* argv[])
{
    char *pt1="";
    pt1=getname();
    //cout<<*pt1;
           cout<<pt1<<endl;
    char *pt2=getname();
    cout<<"\t"<<pt2<<endl;
    //cout<<pt1;
    getch();
    return 0;
}
 
char *getname(void)
{
    char A[20];
    char *ps; // знаю что не инициализирован но в коментариях был вариант
    //char *ps=new char[20];
    //char *ps=A;
    cin>>A;
    //strcpy(ps,A);
    ps=A;
    cout<<A<<"\t"<<ps;
    cout<<(int*)A<<"\t"<<(int*)ps;
    return ps;
}
собственно вопрос - я знаю как написать эту программу но интересно разобраться что не так, то есть понять указатели со строками
указатель на строку возвращает адресс 1го элемента
в функции через cout строку печатает в main нет
но *pt1 выдает правильный 1 элемент, просто pt1 выдает что-то непонятное
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 14:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос указатели (C++):

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

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

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
13.05.2012, 15:06 #2
В функции getname(void) создаётся локальный массив символов и указатель на него, => после выхода из функции массив уничтожается и указатель указывает на пустую область памяти, т.е. на "что-то непонятное". Правильный код (с немного другим форматированием):
C++
1
2
3
4
5
6
7
8
9
10
char *getname(void)
{
    char* A = new char[20];
    char *ps;
    cin>>A;
    ps=A;
    cout<<A<<"\t"<<ps<<"\t";
    cout<<(int*)A<<"\t"<<(int*)ps<<endl;
    return ps;
}
При вводе "test", у меня программа выводит:
C++
1
2
3
4
test
test    test    0x3e24b0    0x3e24b0
test
t
Кстати, в этом случае нужно вручную уничтожить память, выделенную с помощью оператора new.
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
13.05.2012, 19:47  [ТС] #3
тo есть это автоматич хранилище и после все затирается?
вопрос почему при вызове сиаут*гетнейм выдает правильный 1й элемент - или это мусор из памяти?
0
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
15.05.2012, 15:43 #4
Цитата Сообщение от Aliru777 Посмотреть сообщение
тo есть это автоматич хранилище и после все затирается?
Именно.
вопрос почему при вызове сиаут*гетнейм выдает правильный 1й элемент - или это мусор из памяти?
Немного не понял вопроса. Если в функции реализация выглядит как
C++
1
char* A = new char[20];
, то в возвращаемой переменной практически никогда не окажется мусор из незанятой памяти.
Кстати, в вашей первоначальной версии, где
C++
1
 char A[20];
при вызове
C++
1
cout << *(getname());
у меня вообще не компилируется
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 15:43
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

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

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