您的位置:首页 > 编程语言 > C语言/C++

[C]第一章--初识C语言(3)--C新手难点详解

2018-12-03 15:05 337 查看

初识C语言

  • #define 定义常量和宏
  • 指针
  • 结构体
  • 关键字

    什么是关键字?
    关键字也称保留字,是C语言一定定义过的特殊标识符,也就不可以再用作变量名了.

    • C语言常见的关键字有以下这些:
      (从A到Z顺序排列)
    auto break case char const continue
    default do double else enum extern
    float for goto if int long register
    return short signed sizeof static
    struct switch typedef union unsigned
    void volatile while

    以部分关键字为例解析:

    1.typedef

    typedef顾名思义是类型定义,type define,这里应该理解为类型重命名.

    比如将unsigned int重命名为uint_32,所以uint_32也是一个类型名

    typedef unsigned int uint_32;
    int main(){
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
    }
    //这两个类型定义的变量是完全相同的

    2.static

    在C语言中:
    static是用来修饰变量和函数的

    • 修饰局部变量
    #include <stdio.h>
    void test1(){
    int i = 0;
    i++;
    printf("%d\n",i) ;
    }
    void test2(){
    static int i =0;
    i++;
    printf("%d\n",i);
    }
    
    int main(){
    for(i = 0;i < 10;i++){
    test1();
    test2();
    }
    return 0;
    }

    通过比较输出结果我们就可以理解static修饰局部变量的意义.
    结论:
    static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域仍然存在,到程序结束,生命周期才结束.

    • 修饰全局变量
    //代码1
    #include <stdio.h>
    int global_val = 2018;
    int main(){
    printf("%d\n",global_val);
    return 0;
    }
    //代码2
    #include <stdio.h>
    static int global_val = 2018;
    int main(){
    printf("%d\n",global_val);
    return 0;
    }

    代码1正常运行,代码2在编译时会出现连接错误.
    结论:
    一个全局变量被static修饰,使得这个全局变量只能在本源文件中使用,不能再其他源文件内使用.
    也就是会修改这个全局变量的作用域;避免多文件重名定义的冲突,生命周期为当前.c文件.

    • 修饰函数
    //代码1
    #include <stdio.h>
    int Add(int x,int y){
    return c + y;
    }
    int main(){
    printf("%d\n",Add(2,3));
    return 0;
    }
    //代码2
    #include <stdio.h>
    static int Add(int x,int y){
    return c + y;
    }
    int main(){
    printf("%d\n",Add(2,3));
    return 0;
    }

    代码1正常,代码2在编译时会出现连接错误.
    结论:
    一个函数被static修饰,使得这个函数只能在本源文件内被使用,不能再其他原文件中使用.

    部分常用关键字用法之后在实战中详细探讨.

    #define 定义常量和宏

    有一个很常见的误区,define被认为是C语言中的关键字,我们通过查阅前面的关键字表可一发现其实不然,define并非C语言的关键字,且 # 是预处理指令,define定义的内容一般全大写.

    #define MAX 100
    #define ADD(x,y) ((x)+(y))
    #include <stdio.h>
    
    int main(){
    int sum = ADD(2,3);
    printf("sum = %d\n",sum);
    printf("%d\n",MAX*10);
    return 0;
    }

    观察结果我们可以发现 :
    define定义知识简单的直接文本替换.

    指针

    又是这个让人敬而远之的小玩意,人云亦云的是指针到底有多变态,有多抽象.
    指针只不过是一种特殊类型的变量,其中存储的内容就是变量的内存地址(可以看作是房间号).
    其实难的并不是指针,而是内存.
    内存是电脑上特别重要的存储器,计算机中所有的程序运行都是在内存中进行的.
    所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节.
    为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为内存单元的地址.

    int main(){
    int num = 10;
    &num;//取出num的地址
    printf("%p\n",&num);
    //以%p(地址的形式)打印变量num的地址
    //地址表示为十六进制
    }

    那地址如何储存,需要定义指针变量.

    int num = 10;
    int* p = &num;
    //p就是一个整型指针变量
    }

    具体实例:

    #include<stdio.h>
    int main(){
    int num = 10;
    int* p = &num;
    *p = 20;
    return 0;
    }

    分析这段代码,

    • 定义了一个int类型的变量num,它的值是10.
    • 又定义了一个存储变量num地址的指针变量p,
    • 这里可以把星号(*)和int连在一起看,
    • 因为int*与int是两种完全不同的数据类型,
      很多教材把星号与变量名相连接,这样看起来非常不直观,也不容易理解.
    • *p = 20;这一句代码并不是指针大小为20的意思,而是对指针变量p进行解引用操作,在台湾相关术语叫做"提领",它表示的是对其指针所指的方向进行解引用,也就是打开指针指向的门牌号,看看里面到底存着什么?这时就把其中的内容改为了20.

    指针的大小

    #include<stdio.h>
    int main(){
    printf("%d\n",sizeof(char*));
    printf("%d\n",sizeof(short*));
    printf("%d\n",sizeof(int*));
    printf("%d\n",sizeof(double*));
    return 0;
    }

    我们可以得到结果,指针类型的占存大小为4个字节,那么就可以直接下定论了吗?
    其实不然,指针所占的内存大小还与其所处的操作系统有关,有很多32位/64位/16位等等的位数不同的操作系统,指针变量在不同的操作系统中占存不尽相同.

    • 结论:
      指针大小在32位平台上是4个字节,64位上是8个字节.

    结构体

    结构体使得C语言有能力描述复杂类型,可以看成一种自定制的类型,用户根据自己的实际需求定义一些更具实际意义的变量类型.

    比如描述学生,学生包含: 名字+年龄+性别+学号 .这几项信息

    struct Stu{
    char name[1024];//名字
    //(为了防止少数民族同学名字长录入失败
    //这里长度设定尽可能大一些
    int age;		//年龄
    char sex[6];	//性别
    char id[11];	//学号
    };

    与函数定义不同的是,结构体定义要在语句结尾加上一个 ;

    结构体的初始化

    struct Stu s = {"张三",
    20,
    "男",
    "20180101"};
    //这样换行写更加直观

    成员访问操作符

    • .
      点(.)为结构体成员访问操作符
    printf("name = %s,age = %d,sex = %s,id = %s\n",
    s.name,s.age,s.sex,s.id);
    • ->
    void print1(struct Stu* s){
    printf("%d\n",s -> age);
    阅读更多
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: