Why pointer is giving two different addresses?

穿精又带淫゛_ 提交于 2019-12-11 21:32:51

问题


I have this program. And I have some doubts. You can run it in your compiler. I am using gcc compiler in 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;
}

In this code add occupies the address value of each array elements and prints that address one by one through loop. But address value given by add is not equal to the one given by &(a[i][j]) while the values give by these two are equal. That is, *add is equal to *(&(a[i][j])) for each array element. Can some one explain me why this is so?

I printed the size of each element so as to confirm the sequence of data arrangement in memory. As my compiler 32-bit based, it printed the addresses by the gap of 4 bits in case of both add and &(a[i][j]).

In the last I print the initial address of array. This gives the address same as &a[0][0]. So the question is which method is correct, add=&(a[i][j]; or direct out putting the a[i][j]?


回答1:


they are the same address. It might be the sign that makes you think they are different. Use %p to print the pointer or use %u for both.



来源:https://stackoverflow.com/questions/19300307/why-pointer-is-giving-two-different-addresses

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!