как здесь работает приведение типов и разыменование? - PullRequest
0 голосов
/ 04 июня 2019
#include<stdio.h>
int main(){
    int a, b, c;
    char *p = 0;
    int *q = 0;
    double *r = 0;
    cout<<(int)(p + 1);    // printing 1 char size
    cout<<(int)(q + 1);    // printing 4
    cout<<(int)(r + 1);    // printing 8

    int y = 9;
    int *u = &y;
    cout<<(int)(u+1);       //printing 7208688

   cout<<*(p+1);            //not able to dereferance

   }

Как работает приведение типов в обоих вышеупомянутых случаях?

Почему указатели p, q, r не могут разыменоваться?

1 Ответ

0 голосов
/ 04 июня 2019

Разыменование любого из p, q, r, p + 1, q + 1, r + 1 или u + 1 имеет неопределенное поведение, поскольку ни один из этих указателей не указывает на объекты правильного типа.

Вы можете добавить к указателю, чтобы получить другое значение указателя.Это определено только для результатов, которые остаются в пределах одного массива, плюс значение указателя «один за другим» (обработка указателя на один объект как массива длины один).Вы также можете преобразовать указатель в целочисленный тип, чтобы получить значение, определенное реализацией.Выполнение этих действий не требует разыменования указателя.

Добавление к нулевому указателю также является неопределенным поведением, поскольку нулевой указатель не указывает на объект, нет ничего, что могло бы быть «один за другим»"из.

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