试图理解数组符号

时间:2014-01-31 13:08:19

标签: c arrays

在以下代码中:

int main()
{

    int i = 15, j = 1;
    int *a[] = {&i, &j};
    printf("%d", (*a)[0]);
    return 0;

}

(*a)[0]的输出为15(i的值)但是当我尝试检查(*a)[1]时,它会给出一个垃圾值。我希望相同的表达式适用于数组中的所有条目,但它只适用于数组中的第一个元素。

4 个答案:

答案 0 :(得分:8)

这里你已经声明了指针数组。首先,您应该知道数组的各种表示。如何计算[i]? a为您提供数组的基址。

a[ i ]  = *(a+i)
(*a)[0] = *(*a+0)
(*a)[1] = *(*a+1)

Thus the value of (*a)[0] = *(address of i + 0) = Value of i  
And the value of  (*a)[1] = *(address of i + 1) = value at the location of (add of i + 2) i.e. a garbage value.

在上述问题中,如果使用*(a [0])和*(a [1]),则可以正确获取值。

答案 1 :(得分:3)

您不应该首先尝试(*a)[0](*a)[1]。您应该尝试*(a[0])*(a[1])

您有一个名为int *的{​​{1}}数组。 a有两个元素aa[0]a[1]a[0]&ia[1]。因此&j*(a[0])i*(a[1])

答案 2 :(得分:2)

我认为你对这里指针的语义感到困惑(很多人都是)

int x[2]; // an array of two ints
int *y[2]; // an array of two int pointers.

typeof(x[0]) == int // this isn't really valid C code
typeof(*x)   == int // arrays are (pretty much) pointers

typeof(y[0]) == int*
typeof(*y)   == int*
typeof(**y)  == int

答案 3 :(得分:1)

尝试下面这个,你会更好地了解最新情况,这不是你问题的答案,但应该帮助你理解。

oops,你必须将数组名称赋值给一个指针,你不会被这个++增加数组名,因为它不是一个变量,

 int **s = a;
(*++s)[0] this will print 1.

因为数组名称指向第一个元素,所以它会将其递增1(现在它将指向第二个元素),然后取消引用它,并获取指向的内存的[0]元素(* + +α)