0

我有这个程序。我有一些疑问。您可以在编译器中运行它。我在 linux 中使用 gcc 编译器

#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]

4

1 回答 1

0

他们是同一个地址。这可能是让你认为他们不同的标志。使用 %p 打印指针或使用 %u 两者。

于 2013-10-10T15:53:53.940 回答