Подтвердить что ты не робот

Что означает int * p = (int *) 60?

#include <stdio.h>

int main()
{
    int *p = (int*) 60;    --- Line 1
    int *q = (int*) 40;    --- Line 2
    printf("%d", p-q);    //Output is 5
    return 0;
}

Может кто-нибудь объяснить мне вывод этой программы?

4b9b3361

Ответ 1

Это означает, что происходит выполнение (реализация) действия назначения целочисленного значения указателю. Это часто означает, что p указывает адрес памяти в 60 и q на адрес 40. Эти адреса памяти могут быть в виртуальной памяти, аппаратной памяти, и для многих реализаций для них есть разные процедуры преобразования.

Поскольку это определяется реализацией, все может случиться, как описано в вашей реализации.

Но разве это не бесполезно?

Это, скорее всего, не используется, во встроенном аппаратном программировании используется лот для доступа к некоторым функциям или вызова встроенных функций.


Скорее всего, ваша система int имеет ширину 4 байта, поэтому p - q равно (60 - 40) / 4 == 5.

Ответ 2

Это делает p указывать на адрес памяти 60 и q на адрес памяти 40. Предположительно, ваша архитектура имеет 4 байта int и поэтому p - q равно 5 ((60 - 40)/4).

Ответ 3

Вы создаете два значения указателя, а затем выполняете математику указателя. По-видимому sizeof(int) в вашей системе 4 байта, поэтому расстояние между двумя значениями указателя равно 5.

Ответ 4

Каждый указатель, p и q, является указателем на int. p указывает на адрес памяти 60 и q на адрес памяти 40. Когда вы вычитаете q из p, результатом является то, сколько 4 байтов int находится между ними, в этом случае 5. это делается для упрощения использования указателей с массивами, если они находятся в одном массиве.

Для получения дополнительной информации об арифметике указателя см. этот сайт.

Ответ 5

Оператор объявляет указатель на целое число по адресу 60

int *p = (int*) 60;  

Вы, наверное, уже знаете это; Опасность этого: откуда вы знаете, что на самом деле существует целое число, сохраненное по адресу 60?

Ответ 6

Инициализация указателя int заключается в том, чтобы указатель указывал на адрес памяти целого числа, в этом случае память 60 и 40 для указателей p и q соответственно.

Что дает вам вывод, так это различие в ячейках памяти. Обычно вы ожидаете, что 60-40 будет 20, но в этом случае вы получаете 5, потому что на вашем компьютере каждое целое число занимает 4 байта или 32 бит.

Итак, вы можете думать об этом так: Первое целое число в 40 занимает 4 места, поэтому следующее целое число равно 44, затем 48, затем 52. Таким образом, при получении разницы в ячейках памяти программа принимает каждый 4 байт блок как 1 блок, и существует разница в 5 блоков между 40 и 60.

В математике указателя это можно получить как abs (mem_location1 - mem_location2)/sizeof (int) (т.е. количество байтов, занятых целым числом).

НТН.:)