Синтаксис указателя в условии - PullRequest
3 голосов
/ 17 апреля 2019

После инициализации указателя, вам нужно использовать оператор * разыменования для вызова указателя в условии?

Пример:

int main()
{
    int var = 10;
    int *ptr = &var;

    if(ptr)    // does this need to be if(*ptr)  ???
    {.......}
}

А можно мне короткое объяснение почему?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 17 апреля 2019
if (ptr)

проверить, не является ли указатель Null, а

if (*ptr)

, проверить, не равно ли значение, на которое он указывает, нулю (в данном примере 10)

Так что дляпроверка значения, которое вы должны добавить *.

0 голосов
/ 17 апреля 2019

Прежде всего, указатель является только переменной.Однако существуют различные контексты, в которых вы можете использовать его.

Как и любая другая переменная, вы можете получить доступ к содержимому указателей (которое является адресом основной памяти) следующим образом:

int i = 1;
int * p = &i;
std::cout << p << std::endl

это вывело бы адрес i, поскольку это то, что хранится в p

Если вы хотите получить доступ к содержимому базовой памяти (значение i), вам необходимосначала разыменуйте указатель с помощью оператора *:

std::cout << *p << std::endl;

Это выведет значение i, так что 1.

, конечно, вы также можете получить доступ к адресу указателя(поскольку адрес i также является числовым значением и его тоже нужно где-то хранить):

std::cout << &p << std::endl;

Это вывело бы адрес p, так что адрес, где адрес i хранится :) В качестве небольшого примера попробуйте запустить этот код:

#include <iostream>


int main() {
    int i = 1;
    int * p = &i;
    std::cout << "Value of i(i): " << i << std::endl
              << "Adress of i(&i): " << &i << std::endl
              << "Value of p(p): " << p << std::endl
              << "Dereferenced p(*p): " << *p << std::endl
              << "Adress of p(&p): " << &p << std::endl
              << "Dereferenced adress of p(*(&p)): " << *(&p) << std::endl;
}
0 голосов
/ 17 апреля 2019

Это зависит от того, что вы хотите сделать.

if(ptr) проверяет, является ли значение указателя nullptr или нет.Обратите внимание, что это сокращение для if(ptr != nullptr).

if(*ptr) проверяет, является ли указатель , на который указывает , nullptr (или 0) - и в этом случае, поскольку вы разыменовываете (следовать) указатель, чтобы ответить на вопрос, сам указатель имел бы не быть nullptr в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...