其他分享
首页 > 其他分享> > 《C语言初阶 》 第一部分 初识C语言

《C语言初阶 》 第一部分 初识C语言

作者:互联网

大家好,在这里作者会给大家详细介绍C语言的相关知识。首先,我将C语言分为两个阶段—《初阶》和《进阶》,开始从最基本的知识讲起,然后循序渐进慢慢的提高难度。写博客也是作者学习与分享的过程,如果文章里有不正之处,希望大家能及时指出,我将及时改正,谢谢大家!

文章目录

1.初识C语言

C语言是一门面向过程的计算机编程语言,广泛应用于底层开发。
在这里初学者可能不知道底层的意思,我在这简单的介绍一下。
在这里插入图片描述
我们知道电脑是一个硬件,让它工作需要安装一个操作系统,而驱动层就是连接操作系统和硬件使它工作起来,而红线以下的都被我们称为底层。

​​​

2.第一个C语言程序

在这里插入图片描述
在这里我们要理解两个点:

1.main函数是程序的入口

2.一个工程中main函数有且只有一个

首先,解释一下第一个。当我们在vs2019上按下F10后,程序会进入调试状态。
在这里插入图片描述

从这里我们可以看到箭头一开始就指向了main函数的第一行,所以说main函数是程序入口。
第二个如下图所示
在这里插入图片描述
在这里插入图片描述
从这里我们可以看出程序发生了错误,所以我们可以得出main函数有且只有一个。

3.数据类型

char //字符数据类型

short //短整型

int //整形

long //长整型

long long //更长的整形

float //单精度浮点数

double //双精度浮点数

在这里说明一下C语言里没有字符串类型。存字符串需要用到数组(之后会说)。
那么我们可以思考一下这些数据类型的大小是多少?
在此之前先介绍一个操作符sizeof,sizeof-它的作用是计算类型或者变量所占空间的大小。它的单位是字节(byte)。


然后我们可以用vs2019测试一下这些数据类型的大小
在这里插入图片描述
从这我们就可以得出各类型的大小(32位)。这时我们可以看出int类型和long int类型的大小是一样的,这是因为C语言标准规定只要long int类型 大于或等于 int类型就可以。

4.常量、变量

在生活中,有许多变的量和许多不变的量。在C语言中变的量我们称之为变量,不变的量我们称之为常量。

4.1定义变量的方法

这里很简单,我们只需要用数据类型起一个有意义的变量名然后给它初始化就行了。如图所示:
在这里插入图片描述
在这里我们要注意数据类型和变量名之间要加一个空格。然后在创建变量的时候,不初始化是一种不好的风格。

4.12变量的分类

变量分为两类 :1.全局变量 2.局部变量
{ } 就是一个代码块,在代码块内部定义的变量就是局部变量,在代码块外部定义的变量就是全局变量。
在这里插入图片描述
局部变量a的定义有没有什么问题呢?其实并没有什么问题!但结果是多少呢?
在这里插入图片描述
我们可以看出来结果为10。所以当局部变量和全局变量同名的时候,局部变量优先使用,但我们不建议这样使用。

4.3变量的使用

在这里插入图片描述
scanf()函数和printf()函数是C语言里的库函数,是输入输出函数。我们可以在控制台里输入我们想输入的数字,然后就能存到num1和num2两个变量里,然后就能做出相应的加法运算了。

4.4变量的作用域和生命周期

什么叫做作用域,什么叫做生命周期?我们来看一下定义。
在这里插入图片描述
我们举个例子看一下:
在这里插入图片描述
我们可以看到b在第10行报错了,因为b是在第6行和第9行之间定义的,所以它的作用域就在第6行和第9行之间。
而全局变量可在整个工程中任意使用。
在这里插入图片描述
可以看到全局变量在任意位置可以使用。
全局变量的生命周期是整个程序的生命周期
而局部变量的生命周期是进入局部变量所在的范围,生命周期开始,出局部变量所在的范围的时候,生命周期结束。
可能有人会认为作用域和生命周期是一回事,但不是的,我们要细细琢磨其中的含义哦。

4.5常量

C语言中的常量和变量的定义的形式有所差异。
在这里插入图片描述
第一种,字面常量非常简单,就是直接在函数里写。
在这里插入图片描述
第二种,const修饰的常变量。
在这里插入图片描述
我们可以看到第47行num不能被修改,因为它被const修饰了。
当我们想让一个变量不被修改时,我们可以加上const。
但是我们为什么叫它常变量呢?
虽然这里的num是不能被修改的,但是本质上还是一个变量。
这里,我们可以举个数组例子说明一下(数组后面会说)。
我们知道数组的空格里不能使用变量。但加上const行不行呢?
在这里插入图片描述
经过测试我们可以看见,加上const还不行。因为加上const后本质上还是变量,只是具备了常属性。
但是在c99标准中,支持:变长数组,允许变量来指定数组的大小。

第三种,#define 定义的标识符常量
使用如下:
在这里插入图片描述
第四种,枚举常量
枚举的意思就是一一列举。生活中有许多值是可以一一列举的,如性别,日期等等。那如何定义一个枚举常量呢?如下所示:
在这里插入图片描述
在这里插入图片描述我们可以看到它打印出来是个常量,而且并不能修改它。

5.字符串+转义字符+注释

5.1字符串

在这里插入图片描述
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
这里的\0非常重要,我们先来看一些代码。
#include <stdio.h>
//下面代码,打印结果是什么?为什么?(突出’\0’的重要性)
int main()
{
char arr1[] = “abc”;
char arr2[] = {‘a’, ‘b’, ‘c’};
char arr3[] = {‘a’, ‘b’, ‘c’, ‘\0’};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
这里的%s是按字符串打印。
我们用编译器看一下结果:
在这里插入图片描述
这是为什么呢?我们可以用vs2019按F10调试一下。
在这里插入图片描述

我们可以看到arr1数组中比arr2数组多个\0,这个\0就是字符串结束的标志。如果没有\0,则会打印出乱码。

5.2转义字符

转义字符顾名思义就是转变意思。
下面看一些转义字符:
在这里插入图片描述
这里我们只需记住几个常见的转义字符就行了。像\130意思就是8进制的130转换为十进制为88,然后根据ASCII码表来查看88为X。
在这里插入图片描述
这个ASCII表不需要背,记住一些特殊的就行了,像0为48,a为97,A为65,大写字母比小写字母多32,记住这些就行了。
问题1:在屏幕上打印一个单引号’,怎么做?
问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?
其实只要加入转义字符就行了。
在这里插入图片描述

5.3注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
    在这里插入图片描述

6.选择语句

人生中可能面临着许多选择,而在C语言中就有一种选择语句的结构来描绘这种情景。
在这里插入图片描述
这就是选择结构的流程图。而用C语言代码表示如下:
在这里插入图片描述
这里的if else就是选择语句的结构。if意思就是如果怎样,然后发生什么。否则会发生什么。(详细的知识我会在后期讲解)

7.循环语句

有些事生活必须一直做,比如大家,日复一日的学习。
在这里插入图片描述
这是循环的流程图。
那C语言中如何实现循环呢?
while语句-讲解
for语句(后期讲)
do … while语句(后期讲)
在这里插入图片描述
这里while() 括号里就是循环条件,当循环条件为真,则进入循环体,如果为假,则结束循环。

8.函数

之前,我们写过一个让两个数相加的程序。现在,我们用函数实现一下,代码如下:
在这里插入图片描述
在这里我们可以认为函数是个工厂,num1,num2为原材料,sum就是我们所产生的东西。
在这里插入图片描述
函数的特点就是简化代码,代码复用。
这里我们先简单的认识一下,函数的一些基本概念,一个函数需要东西结构,详细的后面再说。

9.数组

首先,我们想一个问题要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合。

9.1数组的定义

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

9.2数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
如图所示:
在这里插入图片描述

9.3数组的使用

在这里插入图片描述
这里我们可以先简单看一下这个代码,就是利用数组的下标来打印整个数组内容。

10.操作符

C语言包含了非常丰富的操作符,甚至可以直接操作内存的数据,直接操作二进制位(先简单介绍,后面重点讲)。
在这里插入图片描述
我们首先可以看到算术操作符,分别为加、减、乘、除、取模(取余),我们重点讲除和取模。C语言里除号和我们数学里是不一样的,如果它的两边都是整数,我们称为整数除法,得出来的是整数而不会是小数。举个列子:
在这里插入图片描述
我们可以看到得出的结果是3,而不是3.5。那我们怎么改成小数呢?只需要改变其中的一个数为小数就行了。
在这里插入图片描述
取模运算符就是取这两个数的余数是多少,但必须注意的是运算符两边都是整数。
移位操作符为(移动的是二进制位),后面会详细讲。
位操作符也是按二进制位来计算
在这里插入图片描述
按位与是对应的二进制位都为1为1,如果有一个0就为0。
按位或是对应的二进制位都为0为0,如果有一个1就为1。
按位异或是对应的二进制位都相同为0,不同就为1。
举个列子(32位):
在这里插入图片描述
在这里3的二进制位为00000000000000000000000000000011

       5的二进制位为00000000000000000000000000000101

  然后计算出结果为00000000000000000000000000000001

转换为10进制就是1。

按位或和按位异或也是一样的道理。

赋值操作符其实是一种复合运算。

像a+=1就是a=a+1.b/=2就是b=b/2。这也比较简单,不一一叙述了。

然后就是单目操作符(只有一个操作数)。
在这里插入图片描述
我们先介绍几个,首先第一个逻辑反操作符就是当你的数是真加上!就会变为假。当你的数为假时,就会变为真。
在这里插入图片描述
在C语言中,0表示假,非0表示真。
然后是sizeof我们一定要注意它是一个操作符,不是函数。作用:用来计算变量或者类型所创建变量占据内存的大小-单位是字节。
在这里插入图片描述
~ 是按位取反(二进制位)

首先,我们要知道一个数的二进制位有原码,反码,补码三种形式。而内存中存储的是二进制的补码。按位取反是按补码取反的。
我们先知道这么回事,详细的原码,反码,补码后面再详细解释。
然后++和–,这两个运算符非常重要,大家要时刻牢记。
前置++,先++,后使用。
后置++,先使用,后++。
前置–,先–,后使用。
后置–,先使用,后–。

举个列子说明一下:
在这里插入图片描述
我们可以看到b=10,是因为a先使用赋值给了b,然后在–,让a变为9。其它的也是一样的道理。
最后,我们说一下强制类型转换操作符。这如何使用呢?我们看下面的代码。
在这里插入图片描述
我们可以看到这样也能得到一个整数,但是有问题的。
在这里插入图片描述
这里可以发现,这样写代码会丢失数据。我们只要将它强制类型转换就行了。
在这里插入图片描述
在这里插入图片描述
&& 所需要的两个事件都为真才为真,|| 必须两个事件都为假才为假。这个和数学是差不多的就不详细说明了。
在这里插入图片描述
条件操作符它的能简化if语句。
它的意思是表达式1是否成立,如果成立则表达式2为真,否则表达式3成立。
我们可以用条件操作符来比较两个数最大值。
在这里插入图片描述
逗号表达式
exp1, exp2, exp3, …expN
逗号表达式是从左向右计算,整个逗号表达式结果是最后一个表达式结果。
在这里插入图片描述
b=0,c=4,然后d=4。这就是逗号表达式的运算。
在这里插入图片描述
关系运算符比较简单,我就不过多说明了,注意后面两个就行了。
在这里插入图片描述
像数组的就是使用了下标引用操作符,使用函数的时候用到的是函数调用操作符。后面的两个后面再讲。

11.常见关键字

在这里插入图片描述
这些关键字我们其实已经见过一些了,我们先说一些,其余的我们之后再说。
首先,关键字我们必须记住两点。
1.关键字是不能自己创建的。
2.关键字不能是变量名。

11.1关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。
比如:
在这里插入图片描述
typedef就相当于给类型重新起了个小名,用法都一样。

11.2关键字static

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

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

11.2.1修饰局部变量

首先,大家先思考下面的代码结果是什么?
在这里插入图片描述
答案是10个2。为什么呢?因为a是test函数里的局部变量,a的生命周期从test函数开始到结束,当a的生命周期结束时,a的内存就会被销毁。所以,每次调用test函数时,a都会重新创建,重新赋值。
现在我们用static修饰一下局部变量a,看一下结果是什么。
在这里插入图片描述
为什么是这样的呢?首先,我们要知道内存是一块比较大的存储空间,在使用内存时会划分出不同的功能区域。它们分别为栈区,堆区,静态区。
在这里插入图片描述

本身局部变量存在于栈区,加上static就会在静态区创建,从而使静态的局部变量出了自己作用域也不会销毁(其实改变了局部变量的生命周期)。

11.2.2修饰全局变量

修饰全局变量是什么样的呢?我们先看一下代码。
在这里插入图片描述
我们可以看到g_val是为申明的标识符。当我们需要用到其它文件里的全局变量需要声明一下,这里我们要用到一个关键字extern,它是专门用来声明外部符号的。
在这里插入图片描述
这样就可以使用了。但我们给g_val加上static呢?
在这里插入图片描述
我们可以看到它报错了,这是因为一个全局变量在整个工程中能被其它文件内部使用,是因为全局变量具有外部链接属性,当一个全局变量被static修饰时,这个变量的外部链接属性变为内部链接属性使得这个全局变量只能在自己所在的源文件内部使用,其它文件不能再使用。

11.2.3修饰函数

在这里插入图片描述
修饰函数和修饰全局变量差不多,函数具有外部链接属性,当一个函数被static修饰时,这个函数的外部链接属性变为内部链接属性,使得这个函数只能在自己所在的源文件内部使用,其它文件不能再使用。

12.#define 定义常量和宏

#define 定义常量我们上面已经说过,这里不在过多叙述了。这里看一下#define 定义宏。
在这里插入图片描述
这里宏的用法和函数差不多,我们先了解一下,之后会详细说明。

13.指针

13.1内存

我们先看一下内存的定义:内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
那么一个变量的地址在怎么用变量来存储呢?我们看一下代码:
在这里插入图片描述
这里%p是用来打印地址的。
& 是取地址操作符,取第一个首地址。
p就是用来存放地址的,在C语言中p叫做指针变量。*说明p是指针变量,int 说明执行的对象是int 类型的。
那我们改如何使用指针?举个例子:
在这里插入图片描述
这里*是解引用操作符,*p可以通过p里面的地址找到num改变它的值。

13.2指针变量的大小

我们先考虑一个问题内存是如何编号的?
比如说在32位机器上有32根地址线,通电之后会产生高电平或低电平(1/0)。当电信号转换成数字信号时:1和0就会组成二进制序列(64位机器上也是一样的)。所以,指针变量的大小取决于地址的大小。
32位平台下地址是32个bit位(即4个字节) 64位平台下地址是64个bit位(即8个字节)
我们可以来验证一下:
在这里插入图片描述
我们可以看到指针大小都是一样的。
这里,我们先了解一下指针,到后面我会用初级和进阶两个部分详细说明指针。

14.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型,结构体可以让C语言创建新的类型出来。
像我们想定义一个人,包含名字+年龄+性别等等,这是一种复杂对象,就要用到结构体了。
例如:我们定义一个学生
在这里插入图片描述
struct 就是定义结构体关键字。
那我们改如何使用它呢?
在这里插入图片描述
我们可以看到有两种方式可以访问结构体成员,一个是.操作符一个是->操作符。
.操作符的使用格式是结构体变量.成员变量名
->操作符的使用格式是结构体指针->成员变量名

在这里,我就把初识C语言写完了,作为一个新人肯定有很多地方有不足之处,说的也不够好,希望大家能够多多包涵,也希望大家可以指出我的错误,我会在之后的文章作出改正,如果大家觉得这篇文章有用的话,也希望大家可以给我点赞支持,在这里,先谢谢大家了,你们的支持就是对我最大的鼓励,我们下一篇文章再见。

标签:初阶,函数,C语言,初识,操作符,内存,我们,变量
来源: https://blog.csdn.net/qq_52154068/article/details/122307777