• c语言知识点3


    C 变量
    变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
    1.C 中的变量定义
    变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:

       extern int d = 3, f = 5;    // d 和 f 的声明与初始化  
       int d = 3, f = 5;           // 定义并初始化 d 和 f
       byte z = 22;                // 定义并初始化 z
       char x = 'x';               // 变量 x 的值为 'x'

    注意
    不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
    2.C 中的变量声明
    变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
    变量的声明有两种情况:
    1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
    2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
    除非有extern关键字,否则都是变量的定义。

    extern int i; //声明,不是定义
    int i; //声明,也是定义

    举个例子:

    extern int a;     // 声明一个全局变量 a
    int a;            // 定义一个全局变量 a
    extern int a =0;  // 定义一个全局变量 a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间
    int a =0;         //定义一个全局变量 a,并给初值

    解释:
    声明之后你不能直接使用这个变量,需要定义之后才能使用。第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是 int a 还是 int a=0 都只能出现一次,而那个 extern int a 可以出现很多次。当你要引用一个全局变量的时候,你就要声明 extern int a 这时候 extern 不能省略,因为省略了,就变成 int a 这是一个定义,不是声明。

    全局变量和局部变量在内存中的区别
    全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
    C语言经过编译之后将内存分为以下几个区域:
    (1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。
    (2)堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的“堆”并不是数据结构中的“堆”。
    (3)全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。
    (4)文字常量区:存放常量字符串。程序结束后由系统释放。
    (5)程序代码区:存放程序的二进制代码。
    显然,C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。
    例子:

    #include <stdio.h>
    #include <stdlib.h>
    int k1 = 1;
    int k2;
    static int k3 = 2;
    static int k4;
    int main( )
    {  staticint m1=2, m2;
        inti=1;
        char*p;
        charstr[10] = "hello";
        char*q = "hello";
        p= (char *)malloc( 100 );
        free(p);
        printf("栈区-变量地址  i:%p
    ", &i);
        printf("                p:%p
    ", &p);
        printf("              str:%p
    ", str);
        printf("                q:%p
    ", &q);
        printf("堆区地址-动态申请:%p
    ", p);
        printf("全局外部有初值 k1:%p
    ", &k1);
        printf("    外部无初值 k2:%p
    ", &k2);
        printf("静态外部有初值 k3:%p
    ", &k3);
        printf("    外静无初值 k4:%p
    ", &k4);
        printf("  内静态有初值 m1:%p
    ", &m1);
        printf("  内静态无初值 m2:%p
    ", &m2);
        printf("文字常量地址    :%p, %s
    ",q, q);
        printf("程序区地址      :%p
    ",&main);
        return0;
    }

    运行结果如下:

    C 常量
    常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
    常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
    常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
    整数常量
    整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
    整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
    例子

    95         /* 十进制 */
    0713       /* 八进制 */
    0X4b       /* 十六进制 */
    30         /* 整数 */
    30U        /* 无符号整数 */
    34L        /* 长整数 */
    32UL       /* 无符号长整数 */

    四种进制说明:
    在二进制中只有 0、1 两种情况,你不会看到比 1 大的数字。二进制是逢 2 就进位,所有数字中没可能有 2 或大于 2 的数字,
    在八进制中有 0、1、2、3、4、5、6、7这八种情况,你也不会看到比7大的数字。八进制是逢8就进位,所有数字中没可能有8或大于8的数字。
    在十进制中有0、1、2、3、4、5、6、7、8、9这十种情况,你更不会看到比9大的数字。十进制是逢10就进位,所有数字中有0~9都有
    在十六进制中有 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中 A 表示 10;B 表示 11;C 表示 12;D 表示 13;E 表示 14;F 表示 15。十六进制数字中含有 A-F 字母,它是 0-9+A-F
    浮点常量
    浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
    当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
    例子

    3.14189       /* 合法的 */
    314156E-5L    /* 合法的 */

    字符常量
    字符常量是括在单引号中,例如,‘x’ 可以存储在 char 类型的简单变量中。
    例子

    \
    
    
    	
    
    

    字符串常量
    字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
    例子:

    "Hello World"

    定义常量
    在 C 中,有两种简单的定义常量的方式:

    • 使用 #define 预处理器。
    • 使用 const 关键字。

    下面是使用 #define 预处理器定义常量的形式:

    #include <stdio.h>
    #define LENGTH 10+10   
    //area = LENGTH * WIDTH;  area = 10 + 10 * 5
    //#define LENGTH (10+10) 
    //整体赋值 area = LENGTH * WIDTH;  area = 20 * 5 
    #define WIDTH  5
    #define NEWLINE '
    '
    int main(int argc,char *agrs[]){ 
        int area;  
        area = LENGTH * WIDTH;    
        printf("value of area : %d", area);   
        printf("%c", NEWLINE);  
        return 0;
    }

    使用const 关键字

    #include <stdio.h> 
    int main(int argc,char *agrs[])
    {
       const int  LENGTH = 10;
       const int  WIDTH  = 5;
       const char NEWLINE = '
    ';
       int area;  
       
       area = LENGTH * WIDTH;
       printf("value of area : %d", area);
       printf("%c", NEWLINE);
    
       return 0;
    }

    下面我们来讲一讲这俩种方式的区别:
    const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量!带有类型。编译运行的时候起作用存在类型检查。
    define 定义的是不带类型的常数,只进行简单的字符替换。在预编译的时候起作用,不存在类型检查。
    两者的区别
    (1) 编译器处理方式不同
    #define 宏是在预处理阶段展开。
    const 常量是编译运行阶段使用。
    (2) 类型和安全检查不同
    #define 宏没有类型,不做任何类型检查,仅仅是展开。
    const 常量有具体的类型,在编译阶段会执行类型检查。
    (3) 存储方式不同
    #define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)const常量会在内存中分配(可以是堆中也可以是栈中)。
    (4) const 可以节省空间,避免不必要的内存分配。 例如:
    #define NUM 3.14159 //常量宏
    const doulbe Num = 3.14159; //此时并未将Pi放入ROM中 …
    double i = Num; //此时为Pi分配内存,以后不再分配!
    double I= NUM; //编译期间进行宏替换,分配内存
    double j = Num; //没有内存分配
    double J = NUM; //再进行宏替换,又一次分配内存!
    const 定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象 #define 一样给出的是立即数,所以,const 定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define 定义的常量在内存中有若干个拷贝。
    (5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
    (6) 宏替换只作替换,不做计算,不做表达式求解;
    宏预编译时就替换了,程序运行时,并不分配内存。

    别废话,拿你代码给我看。
  • 相关阅读:
    $(document).Ready()方法 VS OnLoad事件 VS $(window).load()方法
    ASP.NET MVC之文件上传【二】
    ASP.NET MVC之文件上传【一】
    [JSOI2009]球队收益
    Codeforces 323 B Tournament-graph
    2017 [六省联考] T6 寿司餐厅
    [CQOI2014]数三角形
    Hdoj 3506 Monkey Party
    Loj #125. 除数函数求和(2)
    Codeforces 235 E Number Challenge
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707368.html
Copyright © 2020-2023  润新知