在以下代码中:
int main()
{
int i = 15, j = 1;
int *a[] = {&i, &j};
printf("%d", (*a)[0]);
return 0;
}
(*a)[0]
的输出为15
(i的值)但是当我尝试检查(*a)[1]
时,它会给出一个垃圾值。我希望相同的表达式适用于数组中的所有条目,但它只适用于数组中的第一个元素。
答案 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
有两个元素a
和a[0]
。 a[1]
为a[0]
,&i
为a[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]元素(* + +α)