我在 C 中遇到了一个程序,并看到了指针比较程序。我不明白的是这两个陈述。
j=&arr[4];
k=(arr+4);
第一条语句保存第五个元素的地址,第二条语句的语法是我第一次看到的。谁能解释我的第二个陈述。并且在执行程序后 j 和 k 相等。所以他们指向同一个位置。
我在 C 中遇到了一个程序,并看到了指针比较程序。我不明白的是这两个陈述。
j=&arr[4];
k=(arr+4);
第一条语句保存第五个元素的地址,第二条语句的语法是我第一次看到的。谁能解释我的第二个陈述。并且在执行程序后 j 和 k 相等。所以他们指向同一个位置。
k=(arr+4);
k
mean衰减为arr
指向index 0
.
数组名称衰减到指向它的零索引的指针。通过添加 4 意味着它将指向第 5 个元素。
这是臭名昭著的指针算法!该语句只是将元素的地址分配给指向的地址,arr
并向右偏移4个元素。arr + 4
指向 的地址arr[4]
。
这只是指针算术,混合了 C 的索引<->指针延迟等价。
前者意味着表达式arr + 4
导致arr
(数组的名称)简单地衰减为指向数组第一个参数的指针。换句话说,arr == &arr[0]
是真的。
后者是这种等价性,对于任何指针 a 和整数 i:
a[i] === *(a + i)
这意味着第一个表达式(对 的赋值j
)可以读作j = &(*(a + 4))
,这使得(非常)清楚的是,它只是获取索引为 4 的元素的地址,就像该k
行所做的那样。
每个 arr[4] 语句都扩展到 (arr+4); 由编译器本身声明。
这两个是等价的,可以互换使用。
这段代码使用了一个简单的指针算术案例。它将数组的地址(+4 地址,因此它是第 5 个元素)分配给指针 k。
It's basic pointer arithmetic. k is a pointer, arr is a pointer to the first element of the array (a pointer to arr[0]). So by adding 4 to k, you move the pointer on 4 elements. Therefore k=(arr+4) means k points to arr[4], which would be the fifth element, and the same as j.
两者都是获取指针值的方法。
首先arr[x]
返回 (x+1) 数组内容,您可以使用 & 运算符获取其地址。第二个称为指针算术,返回 arr 指针的地址加上 x 个位置,即 x+1 地址。