其他
再说数组
来源:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
之前在每周小题中留下了这样一个问题:
//代码输出结果什么
//公众号【编程珠玑】
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
解释
在很多情况下,可以将数组名当成指针,有两种情况例外:
sizeof 得到数组大小(这里不是指作为入参的数组名)
& 取地址,得到指向数组的指针
其他时候基本都可以当成指针来使用。
因此第一个结果很容易理解:
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了。
注意
解释到这,想必你已经明白了,但是这里特别提醒两点:
强转慎用
关注编译警告
代码仅作考察,实际中千万不要这么写
相关精彩推荐
关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源