Что означает 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;
}
Может кто-нибудь объяснить мне вывод этой программы?
Ответы
Ответ 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) (т.е. количество байтов, занятых целым числом).
НТН.:)