Почему указатель дает два разных адреса?
У меня есть эта программа. И у меня есть некоторые сомнения. Вы можете запустить его в своем компиляторе. Я использую компилятор gcc в linux
#include<stdio.h>
int main()
{
int j=4,*add;
int i=2;
int a[i][j];
for (i=0;i<=1;i++)
{
for(j=0;j<=3;j++)
{
scanf("%d",&a[i][j],"%d",&a[i][j]);
}
}
for(i=0;i<=1;i++)
{
for (j=0;j<=3;j++)
{
add=&(a[i][j]);
printf("\nSize of %d is %d and address is: %u that should be equal to: %d",a[i][j],sizeof(a[i][j]),&(a[i][j]),add);//Address are not equal while add is having the value of &(a[i][j])
printf("\nSize of %d is %d and value is: %d that should be equal to: %d",a[i][j],sizeof(a[i][j]),*(&(a[i][j])),*add);//Here value at both addresses are same
}
}
printf("\n initial address of the array is: %u that should be equal to address given by &a[0][0]",&a); //And it's equal
return 0;
}
В этом коде add
занимает значение адреса каждого элемента массива и печатает этот адрес один за другим через цикл. Но значение адреса дано add
не равно тому, что дано &(a[i][j])
в то время как значения, данные этими двумя, равны. То есть, *add
равно *(&(a[i][j]))
для каждого элемента массива. Может кто-нибудь объяснить мне, почему это так?
Я напечатал размер каждого элемента, чтобы подтвердить последовательность расположения данных в памяти. Поскольку мой компилятор 32-битный, он печатал адреса с разрывом в 4 бита в случае обоих add
а также &(a[i][j])
,
В последнем я печатаю начальный адрес массива. Это дает адрес такой же, как &a[0][0]
, Таким образом, вопрос в том, какой метод является правильным, add=&(a[i][j]
; или направить a[i][j]
?
1 ответ
Они по одному адресу. Это может быть знаком, который заставляет вас думать, что они разные. Используйте%p для печати указателя или используйте%u для обоих.