初识C语言(3)

什么是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语言到这里就结束啦!感谢烙铁们的阅读,后续会给大家带来更多有用的知识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…

韩国存储芯片顶不住了,加入价格大战,固态硬盘更白菜价了

国产的SSD固态硬盘价格持续下跌&#xff0c;迅速抢占市场&#xff0c;让美韩的存储芯片深感焦虑&#xff0c;之前美光曾跟进一轮&#xff0c;但是由于亏损严重&#xff0c;美光选择了退让&#xff0c;日前韩国第二大存储芯片企业SK海力士选择了跟进&#xff0c;将导致固态硬盘掀…

Linux 终端命令之文件浏览(4) head, tail

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

痞子衡嵌入式:AppCodeHub - 一站网罗恩智浦MCU应用程序

近日&#xff0c;恩智浦官方隆重上线了应用程序代码中心(Application Code Hub&#xff0c;简称 ACH)&#xff0c;这是恩智浦 MCUXpresso 软件生态的一个重要组成部分。痞子衡之所以要如此激动地告诉大家这个好消息&#xff0c;是因为 ACH 并不是又一个恩智浦官方 github proje…

Scratch 之 3D 画笔程序使用

目录 Part1 摄像头固定的3D效果 Part2 尝试移动摄像头 Part3 边缘裁剪 总结&#xff1a; Part1 摄像头固定的3D效果 首先&#xff0c;我们知道sc中有xy坐标。 现在让我们在sc中引入一个新坐标——z坐标。z轴垂直于电脑屏幕&#xff0c;从屏幕外指向屏幕里。(如下图) z坐标…

【Rust日报】2023-08-11 candle:一个极简的Rust机器学习框架

Bevys Third Birthday Bevy 是一个用 Rust 构建的令人耳目一新的数据驱动的游戏引擎&#xff0c;如果你想学习如何使用 Bevy 制作 2D/3D 游戏、可视化、用户界面或其他图形应用程序&#xff0c;那可以访问Bevy官网去了解更多。 阅读原文&#xff1a;https://bevyengine.org/new…

mysql的相关指令

mysql的相关指令 DML 数据操作语言DQL数据查询 mysql -uroot -p //启动数据库 show databases; //查看有哪些数据库 use 数据库名; //使用某个数据库 show tables; //查看数据库内有哪些表 exit; //退出mysql的命令环境 create database 数据库名称 charset utf8; //创建数据…

【BASH】回顾与知识点梳理(二十三)

【BASH】回顾与知识点梳理 二十三 二十三. Linux 账号管理&#xff08;二&#xff09;23.1 账号管理新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd, usermod, userdelusermoduserdel 23.2 用户功能&#xff08;普通用户可使用&#xff09;idfingerchfnchsh 23.3…

uniapp把城市换成26个字母和城市排序

后端返回的数据 我们要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

【分布式技术专题】RocketMQ延迟消息实现原理和源码分析

痛点背景 业务场景 假设有这么一个需求&#xff0c;用户下单后如果30分钟未支付&#xff0c;则该订单需要被关闭。你会怎么做&#xff1f; 之前方案 最简单的做法&#xff0c;可以服务端启动个定时器&#xff0c;隔个几秒扫描数据库中待支付的订单&#xff0c;如果(当前时间-订…

nginx禁用3DES和DES弱加密算法

nginx禁用3DES和DES弱加密算法 项目背景 最近护网行动&#xff0c;收到漏洞报告&#xff0c;如下&#xff1a; 漏洞名称SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】详细描述TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS…

C++类和对象(下)

⭐️ 初始化列表 构造函数体内的赋值不能称为初始化&#xff0c;只能将其称为赋值&#xff0c;因为初始化只能初始化一次&#xff0c;而构造函数体内可以多次赋值。 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个成员…

vscode搭建c语言环境问题

c语言环境搭建参考文章:【C语言初级阶段学习1】使用vscode运行C语言&#xff0c;vscode配置环境超详细过程&#xff08;包括安装vscode和MinGW-W64安装及后续配置使用的详细过程&#xff0c;vscode用户代码片段的使用&#xff09;[考研专用]_QAQshift的博客-CSDN博客 问题如下:…

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 描述 …

MySQL中用什么数据类型存IP地址

提到IP地址(IPv4)&#xff0c;我们脑子里肯定立马浮现类似于192.168.0.1、127.0.0.1这种常见的IP地址&#xff0c;然后结合这个问题“MySQL中用什么数据类型存IP地址&#xff1f;”&#xff0c;于是乎脱口而出用char字符串类型存储。 然后再仔细想想发现&#xff0c;这个IP地址…

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 目录 日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 1、在线Json &#xff0c;可以在线进行json 格式验证&#xff0c;解析转义等操作 2、Gif动图分解&#xff0c;在线把 gif 图分解成一张张单图 3、在线P…

Java一般用于postgis空间数据库通用的增删查改sql命令

目录 1 增加 2 删除 3 查询 4 更新 "public"."JGSQGW_Geo"为某模式下得表 一般postgrel有这样的设计模式 1 增加 #前端绘制出的数据插入 INSERT INTO "public"."JGSQGW_Geo" ( "geom","gridone","gridon…

React Native 列表组件基础知识

ScrollView 组件 ScrollView组件是一个容器滚动组件&#xff0c;当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件&#xff0c;这在性能上是比较差的&#xff0c;所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…

使用node搭建服务器,前端自己写接口,将vue或react打包后生成的dist目录在本地运行

使用node.jsexpress或者使用node.jspm2搭建服务器&#xff0c;将vue或react打包后生成的dist目录在本地运行 vue项目打包后生成的dist目录如果直接在本地打开index.html,在浏览器中会报错&#xff0c;无法运行起来。 通常我是放到后端搭建的服务上面去运行&#xff0c;当时前端…