查看原文
其他

再说数组

守望先生 编程珠玑 2022-09-10

来源:公众号【编程珠玑】

作者:守望先生

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

解释

在很多情况下,可以将数组名当成指针,有两种情况例外:

  • sizeof 得到数组大小(这里不是指作为入参的数组名)

  • & 取地址,得到指向数组的指针

其他时候基本都可以当成指针来使用。

因此第一个结果很容易理解:

12345




首先数组名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个整型元素数组的大小:

12345





但是后面又将其强转为int *,得到指针类型p,那么p-1的指向就如下:

12345





那么解引用得到的值就是5了。

注意

解释到这,想必你已经明白了,但是这里特别提醒两点:

  • 强转慎用

  • 关注编译警告

  • 代码仅作考察,实际中千万不要这么写


相关精彩推荐

你见过数组的这种骚操作吗?

C语言入坑指南-数组之谜

高级指针话题-函数指针


关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存