С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
1

Определение указателя

02.01.2019, 13:28. Показов 685. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main()
{
    int *p;
    cout << p;
}
На этот код компилятор ругается следующим образом:
main.cpp:7:13: warning: 'p' is used uninitialized in this function [-Wuninitialized]

cout << p;

^


А этот код компилируется без ошибок и предупреждений:
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main()
{
    int *p;
    cout << &p;
}
Программа печатает 0x7ffd4a29c208

Верно ли я понимаю, что всякое объявление указателя является определением без инициализации: память выделяется, но никакого значения в эту память не записывается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2019, 13:28
Ответы с готовыми решениями:

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс)...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; ...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

6
2128 / 1211 / 503
Регистрация: 11.10.2018
Сообщений: 6,107
02.01.2019, 13:45 2
Думаю, да. Память выделяется, но в ней находится непонятно что. Поэтому он и ругается.

Добавлено через 2 минуты
cpp.sh инициализирует его 0.
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
02.01.2019, 14:02 3
Память выделяется под сам указатель, но каким именно будет адрес в указателе - не определено. То есть явно мы туда адрес не записывали, но переменная (указатель) сидит в памяти. То место в памяти которое выделено под хранение адреса имело какое то значение, вот это самое значение при печати и видно.

А то что код компилируется это ещё не все. Есть такая штука как неопределенное поведение.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.01.2019, 14:39 4
Jzx, ты в своем коде определил переменную на стеке типа указатель на тип int, у этой переменной как и у любой
другой есть адрес.
C++
1
2
int* p = nullptr; // переменная на стеке типа указатель на тип int
int** p = new int*(nullptr); // переменная в куче типа указатель на тип int
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
02.01.2019, 14:50  [ТС] 5
Цитата Сообщение от _stanislav Посмотреть сообщение
ты в своем коде определил переменную на стеке типа указатель на тип int, у этой переменной как и у любой другой есть адрес.
Это понятно.
Цитата Сообщение от Undisputed Посмотреть сообщение
Память выделяется под сам указатель, но каким именно будет адрес в указателе - не определено.
И это понятно.
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Поэтому он и ругается.
И это тоже.

Я хотел узнать о терминах, о той терминологии, которая применима в данной ситуации. Потому что в стандарте языка мне не удалось найти никакой информации о том, что считается объявлением, определением и инициализацией указателя.
0
2128 / 1211 / 503
Регистрация: 11.10.2018
Сообщений: 6,107
02.01.2019, 15:05 6
Объявление - это как-бы краткая запись, само объявление, маркировка.
Определение - это само описание(для функции), само тело функции.
Инициализация - задание начального значения переменной, как правило делается вначале программы.
Сделайте одолжение. Не говорите больше что Вам тут все понятно - я считаю это плохой тон. Если бы Вам было все понятно - Вы бы сюда не пришли.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
02.01.2019, 16:04  [ТС] 7
Обнаружил интересную информацию:

В стандарте языка C сообщается следующее:
If an object that has static storage duration is not initialized explicitly, then:

— if it has pointer type, it is initialized to a null pointer;
В стандарте языка C++ сообщается то же самое
Variables with static storage duration (3.7.1) or thread storage duration (3.7.2) shall be zero-initialized (8.5) before any other initialization takes place.
То есть если к объявлениям указателей в приведённых примерах приписать слева static, то они будут косвенным образом (implicitly) инициализрованы нулём. Я модифицировал код и проверил: если использовать слово static, то компилятор действительно перестаёт ругаться. Если же использовать слово extern перед объявлением, то получается чистое объявление, не являющееся определением. То есть частично я ответил на свой вопрос:
Цитата Сообщение от Jzx Посмотреть сообщение
Верно ли я понимаю, что всякое объявление указателя является определением без инициализации
Как следствие, нельзя использовать extern и static совместно:
C++
1
extern static int *p; //ошибка
0
02.01.2019, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2019, 16:04
Помогаю со студенческими работами здесь

В чём отличие константного указателя и указателя на константу?
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на...

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru