C语言第五课

目录

  1. 常见关键字
    1.1 关键字 typedef
    1.2关键字static
  2. #define 定义常量和宏
  3. 指针
    3.1内存
    3.2指针变量的大小
  4. 结构体

1.常见关键字

关键字–C语言本身内置的,关键字不是自己创建出来的,也不能创建出来的。C 语言一共有32个关键字,根据功能不同,可以分以下四类:

  1. 数据类型关键字(12个)
    (1)char: 声明字符型变量或函数(1字节)
    (2)short: 声明短整型变量和函数(2字节)
    (3)int: 声明整型变量或函数(2/4字节)
    (4)long: 声明长整型变量或函数(4/8字节)
    (5)float: 声明浮点型变量或函数(4字节)
    (6)double: 声明双精度变量或函数(8字节)
    (7)signed: 声明有符号类型变量或函数
    (8)unsigned: 声明无符号类型变量或函数
    (9)void: 声明函数无返回值或无参数,声明无类型指针
    (10)enum: 声明枚举类型
    (11)struct: 声明结构体变量
    (12)union: 声明共用体(联合)数据类型
  2. 控制语句关键字(12个)
    循环语句
    (1)for: 一种循环语句
    (2)do: 循环语句的循环体
    (3)while : 循环语句的循环条件
    (4)break: 跳出当前循环
    (5)continue: 结束当前循环,开始下一轮循环
    条件语句
    (6)if: 条件语句
    (7)else: 条件语句否定分支(与 if 连用)
    (8)goto: 无条件跳转语句
    开关语句
    (9)switch : 用于开关语句
    (10)case: 开关语句分支
    (11)default:开关语句中的“其他”分支
    返回语句
    (12)return:子程序返回语句(可以带参数,也可不带参数)
  3. 存储类型关键字(4个)
    (1)auto: 声明自动变量
    (2)extern: 声明全局变量
    (3)register: 声明寄存器变量
    (4)static:声明静态变量
  4. 其他功能关键字 (4个)
    (1)const: 声明只读变量
    (2)sizeof: 计算存储空间
    (3)typedef: 给数据类型取别名
    (4)volatile: 说明变量在程序执行中可被隐含地改变

其中auto(自动变量)是常常被忽略的关键字

auto) int a=10;//自动变量,auto被忽略

1.1关键字typedef

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

#include<stdio.h>
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
	//观察num1和num2,这两个变量的类型是一样的
	unsigned int num1 = 0;
	uint_32 num2 = 0;
	printf("%d %d",num1,num2);
	return 0;
}

在这里插入图片描述

1.2关键字static

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

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数
static修饰局部变量

a. 函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈区,放在数据段
例如:无static修饰的局部变量

#include<stdio.h>
void test()
{
    int a=1;
    a++;
    printf("%d",a);
}
int main()
{
   int i=0;
   while(i<10)
   {
	    test();
	    i++;
   }
   return 0;
}

在这里插入图片描述
有static修饰的局部变量:

#include<stdio.h>
void test()
{
    static int a=1;
    a++;
    printf("%d",a);
}
int main()
{
   int i=0;
   while(i<10)
   {
	    test();
	    i++;
   }
   return 0;
}

在这里插入图片描述
可以看出没有static修饰局部变量a时候,输出结果是10个2,有static修饰局部变量a的时候,输出结果是2到11。这是因为static修饰局部变量时候,局部变量出来作用域,不被销毁的,本质上static修饰局部变量,是通过改变变量的储存位置由栈区变到静态区,也使该变量的生命周期变长,使其生命周期和程序生命周期一样。

static修饰全局变量

全局变量是具有外部链接属性的(编译+链接=可执行程序)
static修饰全局变量时候,全局变量的外部链接属性变成了内部链接属性。其他源文件(.c)就不能再使用这个全局变量。(作用域变小了)
例如:没有static修饰全局变量时候
在这里插入图片描述
有static修饰全局变量时候
在这里插入图片描述

static修饰函数

函数也具有外部链接属性,被static修饰时候,外部链接属性变为内部链接属性,其他源文件(.c)不能再使用该函数。

2.define定义常量和宏

//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))//其中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;
}

以后详细讲解。

3.指针

指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

3.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。例如:
在这里插入图片描述
就比如一栋居民楼中每一个房间都有一个编号,可以通过这些编号快速查询到相应的房间。

上图中0x00AFFDF0是储存a的地址,也是向内存申请4个字节中的首地址,其中&是取地址操作符
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。取出变量地址如下:

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

在这里插入图片描述
此时0053FD9C是num的地址。
内存单元:编号–》地址–》地址也被称为指针
那地址如何存储,需要定义指针变量。存放指针(地址)的变量就是指针变量

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

*说明p是指针变量,int说明p(指针变量)指向的对象是int类型的
在这里插入图片描述
*p是解引用操作符,就是通过p中存放的地址,找到p所指的对象,其中 *p是p的指向对象。

#include <stdio.h>
int main()
{
	int num = 10;
	int *p = &num;
	*p = 20;//num被改成为20
	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;
}

在这里插入图片描述
这是32位机器的地址下的指针大小。
在这里插入图片描述
这是在64位位机器的地址下的指针大小。以后详细讲解

结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号这几项信息。
这里只能使用结构体来描述了。例如:

struct Stu
{//成员
	char name[20];//名字
	int age; //年龄
	char sex[5]; //性别
	char id[15]//学号
};
//打印结构体信息
struct Stu s = {"张三"20"男""20180101"};
//.为结构成员访问操作符
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语言中很重要的知识点,指针又是C语言中的难点,这些知识点将在以后在小沐文章中揭开神秘面纱。如果以上有什么不足之处,还望指正,谢谢。

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐曦希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值