• extern int *a与extern int a[]


    extern int *a与int a[]

    Table of Contents

    1 问题:

    以下的声明取自某个源文件:

    int a[10];
    int *b=a;
    

    但在还有一个不同的源文件里,却发现了这种代码:

    extern int *a;
    extern int b[];
    int x,y;
    x=a[3];
    y=b[3];
    

    请解释,当两条赋值语句运行时会发生什么?

    2 解答:

    1. 指针是变量,系统会为每一个变量开辟存储空间,包含指针变量
    2. 数组名神似指针,一些情况下可视为指向数组第一个元素的指针(所以定义的数组声明时被声明为指针也是能够的,仅仅只是声明文件里代表指针用了),可是实际上数组名是"实实在在"的"地址",表示的是存储数组元素的空间的起始位置,系统不会为数组名本身开辟存储空间(&数组名得到的地址还是数组名)
    3. 对待一个变量i,取出变量的内容步骤能够视为:1).找到变量i的地址(&i) 2).取出&i地址起i类型那么大空间的内容作为变量i的值

    在第一个赋值中。编译器觉得a是一个指针变量,所以它提取存储在那里的指针值,并加上12(3和整型的长度相乘),然后对这个结果运行间接訪问操作。但a实际上是整型数组的起始位置,所以作为"指针"获得的这个值实际上是数组的第一个整形元素。它与12相加。其结果解释为一个地址。然后对它进行间接訪问。作为结果,它或者将提取一些随意内存位置的内容。或者因为某种地址错误而导致程序失败。

    在第2个赋值中。编译器觉得b是个数组名,所以它把12加到b的存储地址,然后间接訪问操作从那里获取的值。其实。b是个指针变量,所以从内存中提取的后面的第三个int实际上是从另外的随意变量中取得的。这个问题说明了指针和数组尽管存在关联。但绝不是同样的。

    Author: kirchhoff

    Created: 2014-11-10 Mon 22:13

    Emacs 24.4.1 (Org mode 8.2.10)

    Validate

  • 相关阅读:
    hdu 1003 dp最大子序列和
    模拟题 (+queue队列知识)
    hdu 1016 DFS
    OSGi 系列(二)之 Hello World
    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统
    Mina 系列(四)之KeepAliveFilter -- 心跳检测
    Mina 系列(三)之自定义编解码器.md
    Mina 系列(二)之基础
    Mina 快速入门
    Java 8 Optional 类深度解析
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5084118.html
Copyright © 2020-2023  润新知