来源:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
之前在每周小题中留下了这样一个问题:
//代码输出结果什么
//公众号【编程珠玑】
#include<stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int *p = (int*)(&a+1);
printf("%d,%d",*(a+1),*(p-1));
return 0;
}
本文借这个题目,再说数组。
结果运行一下就知道:
2 5
在很多情况下,可以将数组名当成指针,有两种情况例外:
其他时候基本都可以当成指针来使用。
因此第一个结果很容易理解:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
↑ |
首先数组名a作为指,指向第0个元素,+1后指向第1个,使用*解引用,即得到2。
它等同于a[1]。
很多人不理解的是,第二个结果为什么是5?
这里就必须说到前面提的例外,&作用于数组名时,它是当做数组的,因此取地址后,得到的是一个指向具有5个元素的数组的指针,即int (*)[5]。而指针运算又是什么含义呢?例如,对于int *p,那么p+1,就是指针向后移动 1*sizof(int)字节,对于double *p,p+2就是移动2*sizeof(double)个字节, 那么&a+1,则是移动1*5*sizeof(int),即向后移动5个整型元素数组的大小:
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
↑ |
但是后面又将其强转为int *,得到指针类型p,那么p-1的指向就如下:
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
↑ |
那么解引用得到的值就是5了。
解释到这,想必你已经明白了,但是这里特别提醒两点: