Я участвую в процессе обучения C и начал изучать мир указателей и арифметики указателей. Например, в следующем фрагменте кода:Арифметика указателей в C с использованием переменных массива
int nums[] = {1, 2, 3};
nums
является переменной массива и действует как указатель, который указывает на первую ячейку памяти массива. Я написал следующий код, и я пытаюсь понять, почему я получаю результаты, которые я получаю:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums[] = {1, 2, 3};
if(nums == &nums)
puts("nums == &nums");
else
puts("nums != &nums");
if((nums + 1) == (&nums + 1))
puts("(nums + 1) == (&nums + 1)");
else
puts("(nums + 1) != (&nums + 1)");
printf("nums: %i\n", nums);
printf("&nums: %i\n", &nums);
printf("nums + 1: %i\n", nums + 1);
printf("&nums + 1: %i\n", &nums + 1);
return 0;
}
Я получаю, что nums == &nums
верно, как и ожидалось; однако, когда я применяю арифметику указателя и добавляю 1
в nums
, этот результат не равен &nums + 1
. Другими словами (nums + 1) != (&nums + 1)
, хотя nums == &nums
.
Это выход из программы, которую я получаю:
nums == &nums
(nums + 1) != (&nums + 1)
nums: 2345600
&nums: 2345600
nums + 1: 2345604
&nums + 1: 2345612
Оказывается, что nums
и nums + 1
выключены устанавливается на 4 байта; однако &nums
и &nums + 1
смещены на 12. Почему это смещение составляет 12 байтов, а не 4?
Кстати, вам может потребоваться использовать значения '% p' для printf. – Nayuki
Возможный дубликат [Итак, вы думаете, что знаете указатели?] (Http://stackoverflow.com/questions/232303/so-you-think-you-know-pointers) –