初识C语言(3)

news2024/12/23 14:14:13

什么是C语言
   1.第一个C语言程序
   2.数据类型
   3.变量、常量
   4.字符串+转义字符+注释
   5.选择语句
   6.循环语句
   7.函数
   8.数组
   9.操作符
 10.常见关键字
 11.define 定义常量和宏
 12.指针
 13.结构体

这一篇文章我们从常见关键字开始说起,也是我们初识C语言最后一篇文章了,后面会给大家从各个方面详细的展开来分析,下一篇文章我们会分析分支语句与循环语句。

 10.常见关键字

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语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。

先给大家讲解下面几个,后面遇到了再详细介绍。

10.1关键字typedef

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

 如果我们要将一个变量的类型定义为unsigned int(无符号整型),那么我们也可以用typedef将unsigned int命名为uint_32,之后我们想使用unsigned int时只需要用uint_32就可以了,效果是一样的。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;
}

 10.2关键字static

在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数

 1.static修饰局部变量

接下来请大家来看两段代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test()
{
	int a = 2;
	a++;
	printf("%d\n", a);
}
int main()
{
	int i = 0;

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

	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

这两段代码的区别就是在int a前面加上了static,但是结果是完全不一样的,这是为什么呢?因为在第一段代码中,我们每次进去test函数a的值都会是2,因为每次出test函数a的值就要销毁,这跟它的生命周期有关,所以结果都是3。但是第二段代码用static修饰a后每次a的值都会被保存,这就是static的作用。

 

tatic修饰局部变量
使得局部变量出了作用域并不销毁(空间不会回收),下一次进入函数,依然使用的是上次留下的值
如果返回调用函数,会产生累积的效果
本质上:static 修饰局部变量使得变量的存储位置发生了变化
本来局部变量是放在栈区,被static修饰后,放在内存的静态区,感觉是生命周期变长了
作用域没有变化

其原理是这样的

2. static修饰全局变量

大家来看下面两张图,这两张图的区别在于int 前加了static,第一张图没有static,程序可以运行起来,第二张图就不行了,编译器会报错,这是为什么呢?明明都加了extern声明啊,这是因为static在修饰全局变量时有特殊的作用。

static 修饰全局变量后,使得这个全局变量只能在自己所在的源文件内部使用其他源文件无法使用。
本来一个全局变量是具有外部链接属性的,只要合理的声明,全局变量在其他源文件内部,可以使用。
而被static 修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了。

3.static修饰函数

static修饰函数和修饰全局变量时的作用是一样的,大家可以参考修饰全局变量的作用。

11. #define 定义常量和宏

define定义常量可以给常量赋值,方式如下,定义完后MAX的值就是1000了。

define定义宏,宏和常量的区别就是宏有参数,下面代码的x和y就是参数,参数后面是计算方式。

如果我们在main函数里面调用ADD就能使用了。

//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;
}

12.指针

12.1.内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。


 

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。变量创建的本质是向内存申请空间。为了存放10这个数值,我们向内存申请4个字节的空间
取出方式如下:

#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;

指针使用的实例:

*是解引用操作符,我们利用这个操作符就可以修改a的值。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//pointer
	int a = 10;
	int* pa = &a;
	printf("%d\n", a);

	*pa = 20;//解引用操作, * -> 解引用操作符(间接访问操作符)
	//a = 20
	printf("%d\n", a);

	return 0;
}

指针的理解:
1. 内存单元的编号 = 地址 = 指针
2. 指针变量是用来存放地址(指针),口头语中说的指针一般是指针变量

 12.2 指针变量的大小

#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位平台是4个字节,64位平台是8个字节。


13.结构体

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

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

结构体使用实例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Student
{
	char name[20];
	int age;
	//..
};
struct Book
{
	char book_name[21];
	char author[15];
	float price;
	//...
};
int main()
{
	int num = 20;
	struct Student s1 = {"张三", 20};
	struct Student s2 = {"李四", 39};

	struct Book b = { "明解C语言", "柴田望洋", 66.6f };
	struct Book * psb = &b;

	//结构成员访问操作符
	//结构体变量.成员名
	//结构体指针->成员名

	printf("%s %s %f\n", (*psb).book_name, (*psb).author, (*psb).price);
	printf("%s %s %f\n", psb->book_name, psb->author, psb->price);

	//打印出来
	printf("%s %d\n", s1.name, s1.age);
	printf("%s %s %f\n", b.book_name, b.author, b.price);

	return 0;
}

 结构体的使用还是比较简单的,大家要记住访问操作符。


初识C语言到这里就结束啦!感谢烙铁们的阅读,后续会给大家带来更多有用的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

2023年国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

LangChain手记 Memory

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Memory Memory 使用open ai的API调用GPT都是单次调用&#xff0c;所以模型并不记得之前的对话&#xff0c;多轮对话的实现其实是将前面轮次的对话过程保留&#xff0c;在下次对话时作为输入的message数组的一部分&…

6.1 安全漏洞与网络攻击

数据参考&#xff1a;CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性&#xff0c;是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…

python编程小游戏简单的,python小游戏编程100例

大家好&#xff0c;给大家分享一下python编程小游戏简单的&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 不会python就不能用python开发入门级的小游戏&#xff1f; 当然不是&#xff0c;我收集了十个python入门小游戏的源码和教程&#…

基于Yolov5与LabelImg训练自己数据的完整流程

基于Yolov5与LabelImg训练自己数据的完整流程 1. 创建虚拟环境2. 通过git 安装 ultralytics3. 下载yolov54. 安装labelImg标注软件5. 使用labelImg进行标注&#xff0c;图片使用上面的coco1285.1 点击“打开目录”选择存储图像的文件夹进行标注&#xff0c;右下角会出现图像列表…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…

MySQL中的锁机制

抛砖引玉&#xff1a;多个查询需要在同一时刻进行数据的修改&#xff0c;就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源&#xff0c;而相互不干扰。 写…

mysql 习题总结

1.select sex,avg(salsry) as 平均薪资 from emp group by sex; 2.select depart,sum(salsry) from emp group by depart; 3.select depart ,sum(salary) from emp group by depart order by sum(salary) desc limit 1,1; 4.select name from emp group by name having count(n…

NAS搭建指南一——服务器的选择与搭建

一、服务器的选择 有自己的本地的公网 IP 的请跳过此篇文章按需求选择一个云服务器&#xff0c;目的就是为了进行 frp 的搭建&#xff0c;完成内网穿透我选择的是腾讯云服务器&#xff0c;我的配置如下&#xff0c;仅供参考&#xff1a; 4. 腾讯云服务器官网地址 二、服务器…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库&#xff0c;一套典型的移动端办公工具型APP Axure RP原型模板&#xff0c;可根据实际的产品需求进行扩展&#xff0c;也可以作为移动端原型设计的参考案例。为提升本作品参考价值&#xff0c;在模板设计过程中尽量追求…

Docker简介与安装步骤

Docker简介与安装步骤 一、Docker简介 1、是什么&#xff1f; 解决了运行环境和配置问题的软件容器&#xff0c; 方便做持续集成并有助于整体发布的容器虚拟化技术。 问题&#xff1a;为什么会有docker出现 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您…

Vue+ElementUI实现选择指定行导出Excel

这里记录一下&#xff0c;今天写项目时 的一个需求&#xff0c;就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板)&#xff1a;vue-element-admin 将它拉取后&#xff0c;运行就可以看到如下界面&#xff1a; 这里面的很多功能都已经实现…

【NLP】训练LLM的不同方式

一、说明 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;有各种各样的 训练机制&#xff0c;具有不同的手段&#xff0c;要求和目标。由于它们服务于不同的目的&#xff0c;因此重要的是不要将它们相互混淆&#xff0c;并了解它们适用的不同场景。 在本文中&#…

Docsify侧边栏多级子目录生成

自动生成 docsify 的 sidebar 和 每个子目录中的 sidebar Docsify 官网 网站的部署 Github Page: 国内访问太慢了. 子目录 - [Java](java/) - [设计模式](设计模式/) - [大数据](大数据/)- [presto](大数据/presto/)- [代码阅读](大数据/presto/代码阅读/)- [服务发现](大…

CSS练习

CSS练习 工具代码运行结果 工具 HBuilder X 代码 <!DOCTYPE html> <!-- 做一个表格&#xff0c;6行4列实现隔行换色&#xff08;背景色&#xff09;并且第3列文字红色第一个单元格文字大小30px。最后一个单元格文字加粗--> <html><head><meta ch…

【LeetCode每日一题】——454.四数相加II

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 454.四数相加II 四【题目描述】 给你四个整数…

深度学习笔记(kaggle课程《Intro to Deep Learning》)

一、什么是深度学习&#xff1f; 深度学习是一种机器学习方法&#xff0c;通过构建和训练深层神经网络来处理和理解数据。它模仿人脑神经系统的工作方式&#xff0c;通过多层次的神经网络结构来学习和提取数据的特征。深度学习在图像识别、语音识别、自然语言处理等领域取得了…

c++ qt(第一部分)

c qt&#xff08;第一部分&#xff09; 一.认识QT 1.什么是QT Qt&#xff08;官方发音 [kju:t]&#xff0c;音同 cute&#xff09;是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#…