0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
1

Как узнать, что заданная переменная - это указатель?

21.10.2016, 22:40. Показов 1734. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста - Как узнать что, какая то, переменная это указатель?
Например:

C++
1
int *p = new int;
Как узнать что p - указатель?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2016, 22:40
Ответы с готовыми решениями:

Как узнать что переменная равна -1.#IND
Использую функцию atof(); чтобы преобразовать строку в переменную типа double Но иногда эта...

Это указатель? На что? Как он работает и соответственно функция?
Программа поиска подстроки в заданной строке. В случае нахождения заданной подстроки необходимо...

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это...

Это обьект, переменная или что? Как то вовсе непонятно
Пожалуста, обьясните подробно что такое rhs!! // Функция Add #include <string> #include...

20
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
21.10.2016, 22:41 2
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <type_traits>
 
class A {};
 
int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_pointer<A>::value << '\n';
    std::cout << std::is_pointer<A *>::value << '\n';
    std::cout << std::is_pointer<A &>::value << '\n';
    std::cout << std::is_pointer<int>::value << '\n';
    std::cout << std::is_pointer<int *>::value << '\n';
    std::cout << std::is_pointer<int **>::value << '\n';
    std::cout << std::is_pointer<int[10]>::value << '\n';
    std::cout << std::is_pointer<std::nullptr_t>::value << '\n';
}
Вывод:
Bash
1
2
3
4
5
6
7
8
false
true
false
false
true
true
false
false
std::is_pointer
2
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 22:48  [ТС] 3
Спасибо огромное, сейчас буду экспериментировать!)
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
21.10.2016, 22:57 4
VLADimir5, а какой у вас компилятор? Просто данный код требует поддержки стандарта 2011-го года.
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 22:59  [ТС] 5
Я честно говоря не очень понимаю что имеют ввиду когда спрашивают про компилятор, но я - пользуюсь Visual Studio 2013(v12).
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
21.10.2016, 23:05 6
VLADimir5, Visual Studio - это и IDE и компилятор в одном флаконе. На счёт поддержки C++11 не уверен, пробуйте.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:08 7
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

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
#include <iostream>
using namespace std;
 
template<typename T>
struct IsPointer
{
   enum{ value= false }; 
};
 
template<typename T>
struct IsPointer<T*>
{
   enum{ value= true };
};
 
template <typename T>
bool isPointer(T notused)
{
  return IsPointer<T>::value;
}
 
int main() 
{
    int  v= 10;
    int *p = new int;
    
    std::cout << std::boolalpha;
    std::cout << isPointer(v) <<std::endl;
    std::cout << isPointer(p) <<std::endl;
    
    return 0;
}
http://ideone.com/oGWfN8
2
GbaLog-
21.10.2016, 23:11
  #8

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
bool isPointer(T notused)
...
C++
1
bool isPointer( T )

0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 23:17  [ТС] 9
Не мужики, я шо то не впитываю))) расскажу прямо что я пытаюсь сделать - у меня есть переменная date, эта переменная иногда может быть int,double,char и т.д., а иногда она(date) у меня хранит указатель типа класса Actor, тоесть Actor *. И мне вот нужно сделать проверку на подобии такого:
C++
1
2
if(date == указатель){ delete date;}; 
else return;
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:22 10
Цитата Сообщение от VLADimir5 Посмотреть сообщение
нужно сделать проверку
Во время компиляции? Т.е шаблонами?
0
Модератор
Эксперт CЭксперт С++
5148 / 2328 / 339
Регистрация: 20.02.2013
Сообщений: 5,720
Записей в блоге: 20
21.10.2016, 23:24 11
Лучший ответ Сообщение было отмечено VLADimir5 как решение

Решение

VLADimir5, вот:
C++
1
2
3
4
if ( std::is_pointer<date>::value )
    delete date;
else
    return;
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:26 12
Цитата Сообщение от Avazart Посмотреть сообщение
Во время компиляции? Т.е шаблонами?
Если да используйте специализацию или перегрузку как моем примере выше.
1
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
21.10.2016, 23:26 13
Цитата Сообщение от VLADimir5 Посмотреть сообщение
И мне вот нужно сделать проверку на подобии такого:
Плохая затея. Лучше скажите зачем вам это нужно.
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 23:32  [ТС] 14
Avazart, у меня есть список этих актеров
C++
1
LinkedList<Actor *> cast;
LinkedList:
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
36
37
38
39
#pragma once
template <typename T> struct Node {
    T data;
    Node<T> *next, *prev;
    Node(T data = 0) {
        this->data = data;
        this->next = nullptr;
        this->prev = nullptr;
    }
};
 
template <typename T> class LinkedList {
private:
    Node<T> *head, *tail;
    int length;
public:
    LinkedList();
    LinkedList(LinkedList<T> &list);
    ~LinkedList();
    Node<T>* getHead();
    Node<T>* getTail();
    int getLength() { return length; }
    void addTail(T value);
    void addHead(T value);
    void delHead();
    void delTail();
    void delNode(Node<T> *node);
    void delAll();
    void insertAfterNode(T value, Node<T> *node);
    void insertBeforeNode(T value, Node<T> *node);
    void print();
    void printPref();
    Node<T>* find(T value);
    LinkedList<T> operator=(LinkedList<T> &List);
    LinkedList<T> operator+(LinkedList<T> &list);
    LinkedList<T> operator+=(LinkedList<T> &list);
    bool operator==(LinkedList<T> &list);
    bool operator!=(LinkedList<T> &list);
};

И вооот... Как я говорил, что date(переменная структуры Node) имеет тип int, double, float, char... а иногда как Указатель класса в моём случае это <Actor *>
C++
1
LinkedList<Actor *> cast;
и мне получается нужно сделать в деструкторе LinkedList проверку что если date это указатель который хранит адрес, выделенной ранее динамическую память, то удалить вначале ту выделенную область т.е.

C++
1
delete date;
а потом уже удалять саму структуру Node:

C++
1
2
3
while (head != nullptr){
        delHead();
    }
как это сделать???
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:35 15
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
#include <iostream>
using namespace std;
 
struct Actor
{
   ~Actor(){ cout<<"~Actor()"<<endl; }  
};
 
// if int,double ...
template <typename T>
void destroy(T)
{
  // do nothing
} 
// else (if pointer) 
void destroy(Actor* pointer)
{
  delete pointer;
}
 
int main() 
{
    int  v= 10;
    Actor* p = new Actor;
    
    destroy(v);
    destroy(p);
    
    return 0;
}
Только еще вероятно стоит рассмотреть случай когда указатель на массив(необходимо вызывать delete[] )
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 23:36  [ТС] 16
Оу, спасибо огромное и извените за запару такую))
p.s. пока писал подробно что хочу именно, не видел ответов.....
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:42 17
Хотя идея передавать списку права владения меня настораживает, вы уверены что это нужно?
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 23:44  [ТС] 18
Avazart, вы имеете ввиду что можно было бы лучше передать владение вектору, а не списку?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2016, 23:45 19
Цитата Сообщение от VLADimir5 Посмотреть сообщение
Avazart, вы имеете ввиду что можно было бы лучше передать владение вектору, а не списку?
Вообще не передавать права владения, как мне кажется это было бы более очевидным и ожидаемым.

Если "пользователь вашего кода" выделил вне списка память, то пусть и удаляет сам его потом вне списка.
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 17
21.10.2016, 23:52  [ТС] 20
Avazart, у меня Д.З. такое просто))) Я учусь на 2 курсе и мне нужно написать было LinkedList в классе, что я и сделал, а дома применить его к ранее написанной Видео-базе фильмов IMDb(только раньше я использовал Vector).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2016, 23:52
Помогаю со студенческими работами здесь

Как узнать что это за элемент?
Всем привет. Я новечек в программировании и у меня есть вопрос: На картинке что за элемент?...

Как узнать что это именно страница пользователя?
В моем приложении будет что то похожее на социальную сеть. Значит пользователь регистрируется, и у...

Как узнать что это первый запуск приложения?
Здравствуйте. Собственно вопрос в заголовке. Только нужно максимально простое решение, баз данных,...

Как узнать что это за инстансы SQL Server?
Не пойму к каким сервисам относятся эти инстансы (см. аттач). Можно это как-то узнать?


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru