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 <stdio.h>
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 <stdio.h>
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.c
int year =2022 ;
//test.c
int main()
{
    extern year;          //申明year来自于外部
    printf("%d\n", year);
    return 0;
}
//代码2
//add.c
static int year = 2022;
//test.c
int main()
{
    extern year;          //申明year来自于外部
    printf("%d\n", year);
    return 0;
}
//注意区分add.c和tast.c为两个不同的源文件哦!!!

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

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

11.2.3修饰函数

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

//代码1
//add.c
int Add(int x, int y)
{
    return x+y;
}
//test.c
int main()
{
    extern Add(x,y);             //申明来自外部的函数
    printf("%d\n", Add(2, 3));
    return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
    return c+y;
}
//test.c
int 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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
int main()
{
 int num = 10;
 int *p = &num;
 *p = 20;
    return 0;
}

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

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

指针变量的大小

#include <stdio.h>
//指针变量的大小取决于地址的大小
//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语言到这里也就结束了,这里很多内容都是点到为止,后面会给大家细细解析。感谢大家的支持。

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北冥有鱼-.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值