> 文档中心 > C语言-初识C语言(4)

C语言-初识C语言(4)


11.常见关键字

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

C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。在初识C语言中,先介绍这几个常用的,后面给大家细细解析。

11.1关键字typedef

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

typedef是用于定义新的类型名,在编程中可以用typedef来定义新的类型名来代替已有的类型名。

格式

typedef 已有类型名 新的类型名

通俗点说,就是为已有的类型取别名,例如老鼠,又叫耗子,老鼠也是它,耗子也是它,但不能取新的类型名,也就是说不能凭空造出来一个类型,必须是在已有的类型名的基础上进行取别名。

下面用代码举例

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名typedef unsigned int uint_32;int main(){    //观察num1和num2,这两个变量的类型是一样的    unsigned int num1 = 0;    uint_32 num2 = 0;    return 0;  }

我们可以看到,unsinged int 为原来的类型名,我们给它起了个名字叫 unit_32。、

11.2关键字static

在C语言中:

static是用来修饰变量和函数的

1. 修饰局部变量-称为静态局部变量

2. 修饰全局变量-称为静态全局变量

3. 修饰函数-称为静态函数

11.2.1修饰局部变量

看以下两个代码,有什么不同?

//代码1#include void test(){    int i = 0;    i++;    printf("%d ", i);}int main(){    int i = 0;    for (i = 0; i < 10; i++)    { test();    }    return 0;}
//代码2#include void test(){    //static修饰局部变量    static int i = 0;    i++;    printf("%d ", i);}int main(){    int i = 0;    for (i = 0; i < 10; i++)    { test();    }    return 0;}

运行结果分别为:

 我们可以看到static在修饰变量的时,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 

11.2.2修饰全局变量

static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。

分析以下代码:

//代码1//add.cint year =2022 ;//test.cint main(){    extern year;   //申明year来自于外部    printf("%d\n", year);    return 0;}//代码2//add.cstatic int year = 2022;//test.cint main(){    extern year;   //申明year来自于外部    printf("%d\n", year);    return 0;}//注意区分add.c和tast.c为两个不同的源文件哦!!!

运行后我们可以看到代码1正常,代码2在编译的时候会出现连接性错误。

结论: 一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

11.2.3修饰函数

分析以下代码,跟上面提到的修饰全局变量有着相同之处。

//代码1//add.cint Add(int x, int y){    return x+y;}//test.cint main(){    extern Add(x,y);      //申明来自外部的函数    printf("%d\n", Add(2, 3));    return 0;}//代码2//add.cstatic int Add(int x, int y){    return c+y;}//test.cint main(){    extern Add(x,y);      //申明来自外部的函数    printf("%d\n", Add(2, 3));    return 0;}

运行后我们可以看到代码1正常,代码2在编译的时候会出现连接性错误.

结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

其他的关键字在后面会给大家细细解析。

12.#define定义常量和宏

#define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎。它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了;也可以把任何东西定义成宏。因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙。

定义标识符常量:

例:#define PI 3.141592654

在此后的代码中我们就可以使用PI 来代替3.141592654,而且修改起来也非常方便,使用PI 的话,我们却只需要修改一次(这是十分高效的)。

//define定义标识符常量#define MAX 1000//define定义宏#define ADD(x, y) ((x)+(y))#include int main(){    int sum = ADD(2, 3);    printf("sum = %d\n", sum); sum = 10*ADD(2, 3);    printf("sum = %d\n", sum); return 0;}

在这里大家只要有这个认识即可,后面给大家细细解析。

13.指针

C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量

前面已经提到内存其实就是一组有序字节组成的数组,数组中,每个字节大大小固定,都是 8bit。对这些连续的字节从 0 开始进行编号,每个字节都有唯一的一个编号,这个编号就是内存地址。示意如下图:

那怎样取出变量地址呢?

#include int main(){ int num = 10; &num;//取出num的地址      //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0;}

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

int num = 10;int *p; //p为一个整形指针变量p = &num;

例:

#include int main(){ int num = 10; int *p = &num; *p = 20;    return 0;}

 以整形指针举例,可以推广到其他类型,如:

#include int main(){ char ch = 'w'; char* pc = &ch; //字符型指针 *pc = 'q'; printf("%c\n", ch);    return 0;}

指针变量的大小

#include //指针变量的大小取决于地址的大小//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)int main(){    printf("%d\n", sizeof(char *));    printf("%d\n", sizeof(short *));    printf("%d\n", sizeof(int *));    printf("%d\n", sizeof(double *));    return 0;}

指针为C语言中非常重要的内容,后面会专门拿出来给大家解析。

14.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。

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

这里只能使用结构体来描述了。

struct Stu  //定义结构体{    char name[20];//名字    int age;      //年龄    char sex[5];  //性别    char id[15]; //学号};

结构体初始化:

//打印结构体信息struct Stu s = {"张三", 20, "男", "20220405"};      //.为结构成员访问操作符printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);      //->操作符struct Stu *ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);

初识C语言到这里也就结束了,这里很多内容都是点到为止,后面会给大家细细解析。感谢大家的支持。