zoukankan      html  css  js  c++  java
  • 数组和指针并不相同

    extern int *x;

    extern int  y[];

    x是一个指向int类型的指针,y是一个int型数组,没有给出数组长度,是不完整类型,但是声明的时候数组的长度并不是必须,但我还是建议加上数组的维数,那样只看声明就能知道数组有多大。上面两个声明是不同的数据类型。

    什么是声明,什么是定义?

    声明相当于普通的声明:它所说明的并非自身,而是描述其他地方创建的对象。

    定义相当于特殊的声明:它为对象分配内存。

    这就是为什么一个函数在main函数之前定义,我们不用再声明,main也可以调用这个函数,因为定义是特殊的声明。

     但是C语言,它本身为了和老代码兼容以及一些历史遗留问题,让它变得有些缺陷。比如,都知道定义只能有一次,声明可以有多次。

    eg:

    #include<stdio.h>
    int a;
    int a;
    int main(void)
    {
        int b;
        int b;
        
        return 0;
    }

    变量b会报重复定义,但是变量a却不会,奇怪么?局部变量,和上面说的一样,定义只能一次,声明可以多次,所以变量b重复定义,但是为什么变量a编译器通过了这种写法呢?这里是定义了两次还是其他情况?

    我们把上面的变量b去掉,只测试变量a:

    #include<stdio.h>
    int a=3;
    int a;
    int main(void)
    {
    
        
        return 0;
    }

    #include<stdio.h>
    int a;
    int a=1;
    int main(void)
    {
    
        
        return 0;
    }

    这样三种写法,编译都通过,那么我们再测试:

    #include<stdio.h>
    int a=3;
    int a=1;
    int main(void)
    {
    
        
        return 0;
    }

    终于,报错了。从测试过程来看,gcc还是不允许多次定义同一个变量的。那么为什么前面的测试看起来像是重复定义了呢?这是因为c语言的全局变量,默认有外部属性,int a;int a=1;这样的,第一个是声明,第二个是定义,只有在全局变量时才是这样,上面的int a,相当于extern int a;所以前面三种测试没报错。这个缺陷,在c++中已经修复,c++中绝对不允许这样的写法。

    #include<iostream>
    
    int a;
    int a=1;
    int main(void)
    {
    
        return 0;
    }

    像这样的C语言灰色地带还有很多。

     

    所以,使声明和定义相匹配是很重要的。

    经过gcc检测,形如:

    extern char *p;
    char p[10]="abcd";

    这样的声明和定义是不能通过编译器的,或许c专家编程还是有点古老了吧。

  • 相关阅读:
    Ubuntu中用户名密码和root密码修改
    在Python中,输出格式:%d , %6d , %-6d, %06d , %.6f的一些区分
    定制的print()输出格式
    python编程系列---Pycharm快捷键(更新中....)
    webbrowser控件——Windows下的开发利器
    Windows读写文件的猫腻
    根据GUID获取设备信息
    转:APDU命令格式
    VC中添加消息响应函数
    VC 取消warning
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6929078.html
Copyright © 2011-2022 走看看