初识C语言(上)

news2024/11/16 5:28:44

写在前面

我们正式开始接触到C语言,这是我在学习过C语言后重新写的博客,我把之前的稍微优化了一下,希望能用更加朴素的语言和大家分享,我希望给大家带来一个可以看的懂,理论和实践并行的内容.当然里面也会存在一些错误和不恰当的地方,还请诸位指正.

为何学习C语言

我想从两个方面和大家分析学习C语言的必要性和好处.

语言层面

我们先来下一个结论 C生万物,编程之本, 很多人学习计算机都是从C语言开始的,它是长远IT职业发展的首选,C语言是母体语言,是人机交互接近底层的桥梁 ,学会 C语言,相当于掌握技术核心 . IT行业,一般每10年就有一次变革,40年间,在 TIOBE 排行榜中,C/C++位置长期霸占前三名,没有丝毫撼动,可谓经典永不过时!

个人层面

在当今社会,技术不断的发展和更新,语言更是层出不穷的出现,C++、Java、、python、go.语言实在是太多了,那么我们为何还要学一门很老的语言,我们学习最新的语言不是可以更好的适应当前技术的迭代吗?

每个人都有每个人的理解,首先我来说一下自己的观点.和大多数人一样,我接触的第一门语言就是C语言,那时的我感觉内容多,而且还很难理解,尤其是后面的指针一直在困扰着我,但是当我在后面逐渐学习的其他语言后,C语言的很多理念出现在其中,尤其是一脉相承的C++.C语言的学习可以大大提高我们学习其他语言的能力.

初识C语言

我想分为两个博客的内容和大家整体的过一下C语言的基本知识,这样我们看别人的代码可以看的懂.我认为大家对他有一个认识是非常重要的,这样即使我们深度不够,也有往下探究的欲望.

什么是语言

在现实生活中我们可以很容易的知道人与人交流是通过语言来进行交流的, 人和人可以用汉语,英语,俄语…进行交流,那么人和计算机呢?或者说计算机和计算机是通过什么语言交流的?这就是计算机语言. C语言是常见的一种计算机语言,每一个语言都有自己的优点,也有自己的缺点,C语言同样如此,相比较于其他的语言,C语言更加适合底层开发, 注意C语言是适合底层开发,不意味着只能干,我们也可以使用C语言做上层的业务.

标准

什么事物要想发展要好,必须要有标准.那么什么是标准,在早期我们是通过二进制编程的,很多人要查手册,这里很难,所以那个时候一般研究这些的都是都是科学家.此时有很多科学家觉得我们使用二进制是在是太麻烦了,受不了了,我们给二进制序列起一个名字,例如张三和身份正好对应,我们把这些名字称之为助记符,后面又发展成汇编语言,B语言,C语言和后面的很多语言.

C语言很优秀,很多厂商会对C语言进行定制,自己增加自己的语法,这个时候就出现了差异,这就是杂乱尺寸生,此时又权威的一些人提出了国际标准,也就是K&R标准,这就是标准.后来标准进行迭代,逐渐的迭代出其他的版本,例如流行的C89标准,和后面的C90,C99.主流标准是C89和C90,C99之后都比较少一些,我们主要看C89的知识点.

helloword

我们来认识第一个代码,这是我们几乎每一个程序员都写过的代码.

#include <stdio.h>
int main()
{
	printf("hello,world\n");
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-edO2TK62-1674310603717)(D:/%E6%96%87%E6%A1%A3/typroa/image-20230121215530384.png)]

main

如果你已经尝试了上面的代码,觉得既新奇又饱含疑惑,那么下面我们先来简单的揭开它的面纱.注意,我们找个博客的目的是可以简单的上手C语言,会用就可以了,至于它的原理随着我们学习的深入,我们都会逐渐明白的,所以说不要着急.

我们规定main函数是程序的入口,注意,这里标准直接这样规定的,也就是说我们启动一个程序时,编译器会自动的找到main函数,然后从上往下的开始执行里面的代码.

我们这里需要看一下main函数的大体框架,后面我们要严格按照这个格式来写,至于为什么这里都等到函数那里去谈.

int main()
{
    // 代码
	return 0;
}

在一些比较老的代码规范里面,还存在下面的写法,这里我们强烈不推荐.,他们实在是太老了,而且看着还很别扭.

void main()
{

}

printf

我们从main入口进入了,现在我们开始在想,我们程序的目的是往屏幕上打印Hello World,所以我们调用了一个函数,函数相关的细节我们会单独分享.这个时候我告诉你在标准库里面有一个printf函数可以帮助我们完成这个功能,我们要用这个函数,这里需要引一个头文件stdio.h,我们通过下面的做法来达到这个目的.

#include <stdio.h>

到这里解决我们大部分疑惑,也可以简单的上手写一些代码了.

#include <stdio.h>
int main()
{
	printf("我是C语言的初学者");
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uoGlZyNe-1674310603718)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20221110184246021.png)]


数据类型

我们都知道,我们可以从不同的角度来描述一个物体,假如说这有一个箱子,我们可以这样描述.

image-20221110185411633

这里你会发现有不同的数据类型,存在整数和小数,甚至名字是一串字符.我们计算机要模拟世界,那么肯定要提供这些类型,C语言就给我们内置了很多的数据类型,我们先来见识一下.

数据类型说明大小
char字符类型1 字节
short短整型2 字节
int整型4 字节
long长整型4 字节
long long更长的整形8 字节
float单精度浮点数4 字节
double双精度浮点数8 字节

回答一下下面的问题:

为什么要定义这么多类型?

我们的应用场景是非常复杂的,不同应用场景要求不同大小的空间,比如说,一个人的年龄、身高等变量可以定义成short型,定义成 int型就浪费了空间。

这些类型的大小是什么意思?

根据不同的类型在内存中开辟不同大小的一块空间,每个类型开辟的空间是固定的,至于如何计算,这个我们下面谈

byte & bit

在回答不同类型占据的空间前我们先来看一下计算机里面的一些单位.这里我们用一个宿舍楼来进行举例子.在一所高校中,我们把一栋宿舍楼分成很多个小宿舍,每一个小宿舍都有固定的床位.计算机同样如此,在计算机中,一块很大的内存,我们把他分成很多个小空间,这个空间名字叫做字节(byte),这里我们首先要强调的是字节是内存的基本单位.和每个小宿舍有这个固定床位一样,每一个字节又会被分为八个区域,这个区域叫做比特位(bit),也就是一字节等于八个比特位.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLEjtxHy-1674310603719)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20221110192143072.png)]

sizeof

上面回答了内存的基本单位,这里就理解不同的数据类型占据若干的字节是什么意思了.这个时候我们又在想,我们是不是可以验证一下,你在这里一直给我灌输理论,总是感觉有点不踏实.这里我们就要请出sizeof这个关键字.我们先来解释一下什么是关键字.

我这里直接说我的理解,所谓的关键字是C语言官方给我们提供的,这些关键字有着不同的功能,比如说上面的int,我们可以很清楚的知道int代表的是一个整型.sizeof也是一个关键字,它的作用是计算占据内存空间的大小,单位就是字节.后面我们会遇到很多关键字,我们用一个谈一个.现在开始验证一下这些类型的大小,你会发现printf又出现了新的用法,这个后面会谈到,先暂时这样用着.

#include <stdio.h>
int main()
{
	printf("char       %d\n", sizeof(char));
	printf("short      %d\n", sizeof(short));
	printf("int        %d\n", sizeof(int));
	printf("long int   %d\n", sizeof(long int));
	printf("long long  %d\n", sizeof(long long));
	printf("float      %d\n", sizeof(float));
	printf("double     %d\n", sizeof(double));
	system("pause");
	return 0;
}

image-20220815181109660

常量

生活中的有些值是不变的(比如:圆周率,性别(?),身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资)。 在C语言中,我们会学习到变量,常量,作用域,生命周期…等概念,我们不由得发出疑问,什么是变量,为什么要有变量?这些都是我们需要处理得疑惑.我先谈谈常量,后面再说说变量。所谓的常量就是不可再次修改的数据.它有下面的几种分类.

  • 数值常量 1,2,3…
  • 字符串常量 “abcd”,“defcbg”

这里面我重点谈谈字符串常量,在C语言中,存在一个字符串常量池,这个我们等到操作系统再谈,像"abcd"就是其中的一部分,要是我们想要修改"abcd"变为"bbcd",这是做不到的,有的人可能会感到疑惑,这不是很简单吗,我们只需要把a修改成b不就完成了吗?但是这只是象,"bbcd"也是字符串常量池的一部分,我们所谓的修改,就是更改指针所指向的地址(指针后面谈).

#include <stdio.h>

int main()
{
	char* pa = "abcd";
	printf("%p\n", pa);

	pa = "bbcd";
	printf("%p\n", pa);
	return 0;
}

image-20220506091325578

常量分类

上面的太笼统 这类简单的说一下,在C语言中我们将学习不同的常量.

  • 字面常量 就是字符
  • const 修饰的常变量
  • 枚举 后面谈
  • #define 定义得的标识符常量

注意:const是一个关键字,这个关键字作用是很大的,我们后面会重点分析.

变量

简单得来说,变量就是可以修改得量.变量不同于常量,它可以被修改的.例如int x = 10,x可以修改为20,但是我们不能把常量1修改成常量2.这就是变量定义.在计算机中,变量是一个在内存中开辟特定大小的空间,用来保存数据.

定义变量

这倒是很简单,就是类型 变量名 = 初始化的值.这里我们需要谈一下什么是变量名,前面我们描述箱子的时候,谈到了长度,我们用L表示,此时这里就可以认为L就是一个变量.

int a = 10;          // 定义一个整型变量a  并初始化为 10
double b = 10.2;     // 定义一个双精度浮点数变量b  并初始化为 10

为何要有变量

计算机是为了解决人计算能力不足的问题而诞生的。即,计算机是为了进行计算的。而计算,就需要数据。在计算时,任何一个时刻,不是所有的数据都要立马被计算。如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。这里的盘子,就如同变量,饭菜如同变量里面的数据。换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。那么,为什么吃饭要用盘子?我想吃一口菜了,直接去锅里找不行吗?当然行的,但是效率低。因为我们吃饭的地方,和做饭的地方,是比较"远"的。 总而言之,变量就是为了辅助计算机更加高效率的工作.

变量的分类

变量的分类主要分为两大类,我们尽量不要使用全局变量.

  • 全局变量
  • 局部变量

局部变量

局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动释放.(网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的),下面的a和d都是局部变量.


int main()
{
	int a = 10;
	double d = 11.01;
	return 0;
}

这里来个复杂的,这里就可以验证一下局部变量具有临时性,这里的临时性可以认为对标下面的作用域和生命周期.

#include <stdio.h>

int main()
{
	int a = 10;
	{
		int x = 20;
		printf("x = %d\n", x);
	}	return 0;
}

image-20221110201114971

这里的临时性就可以通过下面的代码验证出来

#include <stdio.h>

int main()
{
	int a = 10;
	{
		int x = 20;
		printf("x = %d\n", x);
	}
	printf("x = %d\n", x);

	return 0;
}

image-20221110201235117

全局变量

这里我想和大家谈谈全局变量,这个有一点重要.所谓的全局变量,全局变量具有全局性 , 我们可以认为是在main函数外边所定义的变量,一般按照g_变量名的格式来走,当然,也可以不按.

#include <stdio.h>

int g_key = 20;        //全局变量
double g_val = 10.00;

int main()
{

	printf("%d\n", g_key);
	printf("%d\n", g_val);
	return 0;
}

image-20221110201701878

注意,如果你坚持看我后面写的博客,就会发现我们很少使用全局变量,它是有一定的缺陷的,等到后面我们会专门谈的.

局部优先

大家看一下下面的代码.如果全局变量和局部变量同名,编译器优先使用局部变量,这就是局部优先原则.

#include <stdio.h>
int a = 10;
int main()
{
	int a = 0;
	printf("a = %d\n", a);
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xhh7vXgN-1674310603724)(D:/%E6%96%87%E6%A1%A3/typroa/image-20221229205407157.png)]

变量的使用

我们先来简单色的通过格式化输入输出来分析一下变量是如何被我门使用的,这些都是很简单的.

printf

这里我们需要再次谈一下printf函数,上面我们已经使用过它的用法了,可能大家会有一些疑惑,这里需要具体的分析一下这个函数.

printf()函数是我们经常使用的的函数之一,他的作用就是将我们想要的数据输出到指定位置,这里的指定位置包含屏幕,我们先使用一下

#include <stdio.h>

int main()
{
	int a = 10;
	printf("%d\n", a);
	return 0;
}

image-20220303171640754

这里我们可以看到,我们使用了printf()函数

printf("%d\n",a);

这里有几点要说一下

  • % 被称为 “转换说明”,所谓的转换说明就是将数据按指定的格式显式出来
  • %d是指将a的值以十进制的形式打印来,例如 %o :打印八进制、%x 打印十六进制…

数据输出的格式与很多,下面我列出一张表

X例子说明
d%d打印int型,默认1
f%f打印float型,小数点后默认6位
e%e以科学计数法的形式打印,小数点后默认6位
g%g以科学计数法或者float型打印,方式看g的大小选择

scanf

我们在想既然变量是可以变化的,我们总不能把先要的值全部列出来吧,我们如果手动输入该如何做到呢?这里给大家简绍一个scanf函数.

和printf() 一样,scanf()也是存在特定的格式读入,这里先给出个例子,我们一起来看看

#include <stdio.h>

int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", a);
	return 0;
}

image-20220303201025477

作用域&生命周期

这个一直是一个比较容易模糊的点,有很多人对他们的区别可能分不太清楚,一般我们能分辨清楚就可以了

  • 作用域 变量可以被使用的地方,就是作用域
  • 生命周期 变量开始开辟空间 到 空间销毁

这里我先给出点结论,适合大部分情况.局部变量的作用域和生命周期是在局部变量所在的代码块中,除了代码块就不可以了.全局变量的作用域和生命周期是整个程序.

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

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

相关文章

mac 疑难问题汇总

macos 更改zsh到bash查看当前系统有哪些bash命令行&#xff1a;cat /etc/shells切换成bash命令行&#xff1a;chsh -s /bin/bashmac触摸屏轻点设置Mac通过crontab设置定时任务报错Operation not permitted1、系统偏好设置->安全性和隐私->完全磁盘访问权限2、解除锁定允许…

【双向链表】java代码实现

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;上一篇文章我和大家一起去探索了单链表的知识世界&#xff0c;今天我们去接触双向链表&#xff0c;什么&#xff1f;没听错&#xff0c;就是双向链表&#xff0c;比单链表更…

UE INI文件操作 INI File Operation [ Read / Write ] 插件说明

在 Windows 平台上的 INI 文件读写操作 1. Write INI String 输入&#xff1a; Directory&#xff1a; 选择保存目录 Project Directory &#xff1a; 当前项目目录Project Content Directory&#xff1a;当前项目 Content 目录Project Config Directory&#xff1a;当前项目…

JVM内存区域的划分

根据 JVM 规范&#xff0c;JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 程序计数器&#xff08;线程私有&#xff09;&#xff1a; 是当前线程所执行的字节码的行号指示器&#xff0c;每条线程都要有一个独立的程序计数器&#xff0c;这类内存也称为…

Java基础08:面向对象进阶(上)

Java基础08&#xff1a;面向对象进阶&#xff08;上&#xff09;一、static1. 静态变量2. 静态方法3. 工具类4. static注意事项5. 重新认识main方法二、继承1. 继承的概念2. 继承的特点3. 继承中访问成员变量4. 继承中访问成员方法&#xff08;方法重写&#xff09;5. 继承中访…

给大家准备了程序员专属红包封面,审核通过后我哭了,太心酸了(┬_┬)

大家好&#xff0c;我是小悟 今天就是除夕了&#xff0c;也就是大年三十&#xff0c;小伙伴们应该都回家了吧&#xff0c;小悟祝大家新年快乐&#xff0c;身体健康&#xff0c;万事如意&#xff0c;兔飞猛进哦。 春节临近&#xff0c;收到微信定制红包封面并送了四千个名额的…

【深度学习】详解 MoCo

目录 摘要 一、引言 二、相关工作 三、方法 3.1 Contrastive Learning as Dictionary Look-up 3.2 Momentum Contrast 3.3 Pretext Task 四、实验 4.1 Linear Classification Protocol 总结 ☆ 实现 参考资料 Title&#xff1a;Momentum Contrast for Unsupervised…

AlmaLinux 9 安装Kasm Workspaces

今天尝试一下AlmaLinux 9 安装Kasm Workspaces。 前提条件 安装了Docker和Docker Compose&#xff0c;已经最新版本要求&#xff0c; docker 18.06 docker compose 2.1.1 创建一个Swap分区 下面的步骤将创建一个2千兆字节&#xff08;2048MB&#xff09;的交换分区。请根据…

我的创作纪念日——“永远相信美好的事情即将发生”

作者&#xff1a;非妃是公主 专栏&#xff1a;《程序人生》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录序与CSDN的往事机缘收获憧憬碎碎念序 第一次写创作纪念日的文章&#xff01;哈哈哈哈&#xff0c;今…

一起自学SLAM算法:7.5 基于因子图的状态估计

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 虽然式&#xff08;7-90&#xff09;所示的完全SLAM系统可以用滤波方法求解&#xff0c;比如著名的Fast-SLAM实现框架。但是&#xff0c;贝叶斯网络表示下的完全SLAM系统能很方面地转换成因子图表示&#xff0c;…

字符串匹配: BF与KMP算法

文章目录一. BF算法1. 算法思想2. 代码实现二. KMP算法1. 算法思想概述2. 理解基于最长相等前后缀进行匹配3. 代码中如何实现next数组5. 代码实现6. next数组的优化一. BF算法 1. 算法思想 BF 算法, 即暴力(Brute Force)算法, 是普通的模式匹配算法, 假设现在我们面临这样一个…

24/365 java 观测线程状态 线程优先级

1.观测线程 JDK中定义的线程的六个状态 &#xff1a; 可以用getState()来观测线程 public static void main(String[] args) throws InterruptedException {Thread thread new Thread(()->{for (int i 0; i < 10; i) {try {Thread.sleep(100);} catch (InterruptedExc…

2023适合新手的免费编曲软件FL Studio水果21中文版

水果软件即FL Studio&#xff0c;这是一款较为专业的编曲软件&#xff0c;这款软件自带高品质打击乐、钢琴、弦乐以及吉他等107种乐器效果&#xff0c;内置了包括经典电子音色、合成利器3xosc、sytrus、slicex等多种插件&#xff0c;可以帮助音乐制作人创作不同的音乐曲风&…

数据结构进阶 哈希表

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;模拟实现高阶数据结构 哈希表 哈希表 哈希桶哈希概念举例哈希冲突哈希函数哈希冲突的解决方式之一闭散列 --开放定址法哈希表的…

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程

文章目录CalmAn简介安装要求我的设备1>CalmAn压缩包解压&#xff08;caiman文件夹要改名&#xff09;2>conda创建虚拟环境3>requirements依赖包配置&#xff08;包括tensorflow&#xff09;4>caiman安装(mamba install)5>caimanmanager.py install6>PyCharm添…

51单片机独立按键

文章目录前言一、按键原理图二、代码编写三、模块化管理按键总结前言 本篇文章将带大家学习独立按键按键的基本操作。 独立按键式直接用I/O口线构成的单个按键电路&#xff0c;其特点是每个按键单独占用一根I/O口线&#xff0c;每个按键的工作不会影响其他I/O口线的状态。 一…

MongoDB学习笔记【part5】基于 MongoRepository 开发CURD

一、MongoRepository Spring Data 提供了对 mongodb 数据访问的支持&#xff0c;只需继承 MongoRepository 类&#xff0c;并按照 Spring Data 规范就可以实现对 mongodb 的操作。 SpringData 方法定义规范&#xff1a; 注意事项&#xff1a; 不能随便声明&#xff0c;必须要…

汇编语言学习笔记 下

本文承接汇编语言学习笔记 上 上篇文章记录了汇编语言寄存器&#xff0c;汇编语言基本组成部分&#xff0c;数据传送指令&#xff0c;寻址指令&#xff0c;加减法指令&#xff0c;堆栈&#xff0c;过程&#xff0c;条件处理&#xff0c;整数运算的内容 高级过程 大多数现代编程…

day24-网络编程02

1.NIO 1.1 NIO通道客户端【应用】 客户端实现步骤 打开通道指定IP和端口号写出数据释放资源 示例代码 public class NIOClient {public static void main(String[] args) throws IOException {//1.打开通道SocketChannel socketChannel SocketChannel.open();//2.指定IP和端…

你是真的“C”——2023年除夕夜 牛客网刷题经验分享~

2023年除夕夜 牛客网刷题经验分享~&#x1f60e;前言&#x1f64c;BC89 包含数字9的数 &#x1f60a;BC90 小乐乐算多少人被请家长 &#x1f60a;BC91 水仙花数 &#x1f60a;BC92 变种水仙花 &#x1f60a;BC93 公务员面试 &#x1f60a;总结撒花&#x1f49e;&#x1f60e;博…