前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再说数组

再说数组

作者头像
编程珠玑
发布2019-12-16 17:36:46
2330
发布2019-12-16 17:36:46
举报
文章被收录于专栏:编程珠玑编程珠玑

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

作者:守望先生

ID:shouwangxiansheng

之前在每周小题中留下了这样一个问题:

代码语言:javascript
复制
//代码输出结果什么
//公众号【编程珠玑】
#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;
}

本文借这个题目,再说数组。

题解

结果

结果运行一下就知道:

代码语言:javascript
复制
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了。

注意

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

  • 强转慎用
  • 关注编译警告
  • 代码仅作考察,实际中千万不要这么写
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题解
    • 结果
      • 解释
        • 注意
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档