在尝试理解C语言中的指针数组时,我编写了这个简单的程序。但是我不明白这是如何正常工作的:
#include <stdio.h>
int main() {
int array [] = {1,2,3,4,5,6,7,8,9,0,1,2,5}, *ip = array+4;
printf("%d\n", ip[1]);
return 0;
}
输出为
6
有人能解释一下这个指针数组的输出结果是6吗?
答案 0 :(得分:4)
如果您了解数组索引符号的含义,可能会有所帮助。当您看到x[y]
时,它完全等同于*(x + y)
。
因此,以ip[1]
为单位,
*(ip + 1)
由于ip
被分配了值arr + 4
,因此与以下内容相同:
*(arr + 4 + 1)
哪个是
*(arr + 5)
哪个是
arr[5]
其中包含值6。
答案 1 :(得分:1)
此处private temporary table
指向arr
的开头,即指向{1,2,3,4,5,6,7,8,9,0,1,2,5}
。
然后1
将指向元素arr+4
(距离1个位置4个整数位置)。
所以5
将指向数组ip
然后,{5,6,7,8,9,0,1,2,5}
将是ip[0]
,5
将是ip[1]
...。等等。
6
所以结果并不出乎意料。...正如预期的那样!
希望有帮助!
答案 2 :(得分:1)
根据S.K的深度C。 Srivastava
数组名是指向第一个的常量指针 数组的元素,即存储第一个元素的地址, 也称为数组的基地址。
因此,当您使用数组名称时,它将像您在使用&arr[0]
一样,当您向其中添加4
时,它会为您提供arr[4]
的地址,即5
。因此,指针ip
现在包含包含5
的元素的地址。
现在,在下一行中,当您编写ip[1]
时,只不过是*(ip+1)
,即,您将1
添加到ip
上,然后取消对该指针的引用。当您将1
添加到ip
时,它开始指向下一个元素,即ip
包含元素6
的地址,因此6
被打印。
另请参见:
https://www.cs.cmu.edu/~ab/15-123S09/lectures/Lecture%2005%20-%20%20Arrays%20and%20Pointers.pdf
答案 3 :(得分:0)
* ip = arr + 4 //这意味着ip将指向数组arr的底部的4个值。
所以ip是{5,6,7,8,9,0,1,2,5}
因此ip [1] = 6是正确的输出。