У меня есть эта программа. И у меня есть некоторые сомнения. Вы можете запустить его в своем компиляторе. Я использую 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]
?
Ни один из '% d' или'% u' для указателей. Для этой цели используйте '% p' (и отбрасывать на' void * '). –
Также есть '% d', другой -'% u'. – dornhege
Тот же адрес, но разные представления. – deepmax