0

У меня есть эта программа. И у меня есть некоторые сомнения. Вы можете запустить его в своем компиляторе. Я использую 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]?

+7

Ни один из '% d' или'% u' для указателей. Для этой цели используйте '% p' (и отбрасывать на' void * '). –

+0

Также есть '% d', другой -'% u'. – dornhege

+3

Тот же адрес, но разные представления. – deepmax

ответ

0

они одинаковые адреса. Это может быть признаком того, что вы думаете, что они разные. Используйте% p для печати указателя или используйте% u для обоих.

+0

Спасибо тебе, Тристан. :) Ты прав. Я использовал% u для ** add **. И адрес подходит для обоих. Но теперь вопрос в том, почему% d дает адрес -ve. Я знаю, что он используется для целочисленных переменных, а не для целых указателей. Еще раз спасибо. :) –

+0

Спасибо, что я использовал% u для обоих, и адреса пришли равными. –

+0

Использование% u и% p делает разные вещи. оба дают адреса указателя. но один дает адрес в целочисленной форме, другой дает в 0axtu23i90 что-то вроде этого. поэтому, используя% u, мы можем добавлять/вычитать адреса. –

Смежные вопросы