【鹏哥C语言网课笔记】初识C语言
目录
1、数据类型
2、变量、常量
2.1 变量/常量的含义与创建
2.2 变量的分类
2.3 变量的作用域和生命周期
2.3.1 作用域
2.3.2 生命周期
2.4 常量
2.4.1 字面常量
2.4.2 const 修饰的常变量
2.4.3 #define定义的标识符常量
2.4.4 枚举常量
3、字符串+转义字符+注释
3.1 字符串
3.1.1 字符串存储
3.1.2 字符数组不同初始化对比
3.2 转义字符
3.3 注释
4、选择语句、循环语句、函数后面详细讲解
5、数组
5.1 数组创建
5.2 数组的访问
5.3 数组的打印
6、操作符
7、常见关键字
7.1 typedef 类型重定义
7.2 static 静态的
8、 #define 定义常量和宏
9、指针
9.1 内存
9.2 指针变量
9.3 指针变量大小
10 结构体
1、数据类型
C语言中数据类型如下表:
数据类型 | 类型说明 | 所占内存大小 | printf打印输出时格式 |
char | 字符数据类型 | 1字节 | %c |
short | 短整型 | 2字节 | |
int | 整型 | 4字节 | %d |
long | 长整型 | 4字节 | %ld |
long long | 更长的整型 | 8字节 | %f |
float | 单精度浮点型 | 4字节 | %lf |
double | 双精度浮点型 | 8字节 |
C语言中有没有字符串类型呢?
字符串是用字符数组进行存储,数组是一块内存空间,用字符数组来存放字符串。
定义格式:char string[ ] = "abcde"; //双引号是引用字符串的
字符串的打印格式:%s 例如printf(“%s”,string);
地址打印格式: %p:是专门用于打印地址的。
【补充】
(1) C语言中计算变量所占内存大小的函数是sizeof,sizeof()的单位是字节byte。
(2)计算机中的单位(从小到大):bit—byte—kb—mb—gb—tb—pb
(3)大小换算关系:1byte=8bit 1kb=1024byte 1mb=1024kb 1gb=1024mb 1tb=1024gb
(4)数据类型的作用是用来创建变量的。
利用sizeof计算数据类型所占内存
2、变量、常量
2.1 变量/常量的含义与创建
变量和常量含义:不能改变的量称为常量;能被改变的量称为变量。变量意味着可变。
变量的创建:(1)数据类型 变量名字 = 0 (推荐:在创建时赋初值)
(2)数据类型 变量名字 (不推荐)
2.2 变量的分类
变量可分为局部变量和全局变量
- 局部变量 在代码块{ }内部定义的变量,只能在{ }内部使用,在main函数内部定义的变量也是局部变量
- 全局变量 在代码块{ }外部定义的变量,所有代码都可以使用,例如在所有函数外部定义的变量
【说明】
当局部变量和全局变量名字冲突的情况下,在函数内部局部变量优先使用。
在定义变量的时候,不建议把局部变量和全局变量的名字写成一样的。
2.3 变量的作用域和生命周期
- 作用域: 一段代码中所用到的名字并不总是有效的/可用的,限定这个名字的可用性的代码范围就是这个名字的作用域。通俗来讲,这个变量在哪里可以使用,哪里就是它的作用域。
- 生命周期:指从变量的创建到变量的销毁之间的时间段。
2.3.1 作用域
(1)局部变量的作用域:就是变量所在的局部范围。例如在代码块{ }中定义了某个变量,该变量的使用范围就是在该代码块{ }中变量定义位置之后可以对该变量使用。在{ }外部是不能使用的,不管是在上部还是下部都是不能使用的;在{ }内部该变量定义之前也不能使用。
(2)全局变量的作用域:整个工程任何地方都可使用。
a.全局变量使用说明一:在同一文件中定义的全局变量。
如下图所示,定义了全局变量g_val,该变量下面的任何地方都可以使用。
b.全局变量使用说明二:在同一工程内,不同源文件中定义的全局变量。
跨文件使用全局变量的时候,只要用extern声明一下变量就可以使用。声明的意思就是告诉这个文件有这么一个变量。如下图所示,在add.c文件中定义了一个变量g_val,在test4_2.c文件中使用时用extern声明一下该变量,在该文件中就可以使用。
【注意】
(1)执行性的代码(打印一句话、变量赋值)必须要写到函数/大括号{ }里面去,变量的创建可以写到{ }外部。如下图所示是错误的,将printf()语句写到了函数外面。
2.3.2 生命周期
(1)局部变量的生命周期:进入局部范围{ }内部生命开始,出局部范围后生命结束。
(2)全局变量的生命周期:程序的生命周期。一个程序的main函数就是这个程序的生命周期。因为整个程序是从main函数第一句话开始执行,一直执行到return 0后,代码就会结束。
2.4 常量
不变的量就称为常量。常量的属性是一旦被定义,就不能被改变。
C语言中常量分以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
2.4.1 字面常量
2.4.2 const 修饰的常变量
const修饰的变量,本质上还是变量,只不过具有常量的属性(不能被改变的属性)。是具有常量的属性的变量。
用const修饰的常变量具有以下特点:
(1)const修饰的变量是不能被修改的。如下图所示,const修饰的变量num,他具有常数的属性,他的数值是不能被修改的。
(2)被const修饰的变量,不能被用来创建数组的,创建数组必须是常量。这条可以证明被const修饰后,是变量。下图中n本质属性是变量,只不过被const修饰了一下,从根上还是变量,只不过不能被变了,本质上是变量。
2.4.3 #define定义的标识符常量
#define MAX 10000
上面MAX就是define定义的标识符常量,MAX这个符号就是10000的意思,MAX是不能改变的。
define定义的标识符常量后不需要加;号。
2.4.4 枚举常量
枚举常量的含义:可以一一列举的常量。
枚举常量定义方式:关键字enum——枚举关键字
枚举类型中放的三个值就是枚举常量。
和结构体有些类似。
enum 变量名
{//以下取值就是这种枚举类型的变量的未来可能取值//枚举常量取值1;取值2;取值3;
}
当把枚举常量打印出来后,它的值是从0开始的,它的值是不能改的。
3、字符串+转义字符+注释
3.1 字符串
字符串就是一串字符,是用双引号括起来的一串字符。
【注】字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。
3.1.1 字符串存储
字符串的存储:字符串是多个字符,多个字符如何存起来呢?——利用字符数组存起来。
字符数组——数组是一组相同类型的元素。
字符串里放的都是字符,就可以把字符串存到一个字符数组里。
如下程序所示,用char类型创建了一个数组arr[ ],方框内没有写大小,会根据后面字符串大小来初始化它的大小。
(1)字符串在结尾的位置隐藏了一个\0的字符。
(2)\0是字符串的结束标志,计算字符串长度时,\0只是结束标志而已,不算字符串内容,在求字符串长度的时候,不计算它。
3.1.2 字符数组不同初始化对比
给字符数组赋值一个字符串和给字符数组赋值字符进行对比
如下图所示,给字符数组arr1[ ]初始化时幅值一个字符串“abc“,和给字符数组arr2[ ]初始化时幅值一个字符数组{'a','b','c'}进行对比。
(1)对比一:当进行调试观察数组元素的时,数组arr1[ ]有4个元素,最后一个元素是\0,arr2[ ]有3个元素,如图一所示。
(2)对比二:当进行打印输出结果时,arr1[ ]的输出结果是abc,arr2[ ]的输出结果abc后面是乱码,如图二所示。arr1[ ]打印abc后遇到字符串结束标志\0,就不会往后打印了,就会停下,只打印abc,arr2[ ]打印abc后,后面没有\0,abc后面的内存放的是什么不知道,所以abc后面空间的内容是未知的,对于未知的内容打印出来就是乱码。
如果想让arr2[ ]也输出abc,可以在arr2[ ]内部放入\0的字符。
(3)求字符串的长度。利用strlen函数求字符串长度。字符串的结束标志\0仅仅是结束标志,在计算字符串长度的时候,没有包含\0。strlen函数从数组元素向后一直寻找\0,直到找到\0的时候就会停下来。在求arr2[ ]长度的时候在'c'后面没有找到\0,就会继续往内存中寻找,直到找到\0为止。
当在arr2[ ]后加上‘\0’字符后,再去求字符串长度,则arr1[ ] 和arr2[ ]长度是相等的。
【注意】
(1)以下写法是不对的,arr前用char来修饰,是字符变量,但后面赋值又赋值为字符串,是不对的。
char arr ="abcd"
(2)在求数组元素个数的时候是会算\0的,求字符串长度的时候是不算\0的。求数组元素个数的计算方法可以用sizeof(arr)/sizeof(arr[0])来计算数组元素个数。
3.2 转义字符
含义:转义字符就是转变了字符原有的意思。例如\n,不再是普通的一个\加一个n的意思,而是换行的意思,它也转变了字符原来的意思,转变成换行的意思。
C语言中的转义字符有:
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量' |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转移序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v |
垂直制表符 |
\ddd | ddd表示1-3个八进制的数字。如:\130 含义:X |
\xdd | dd表示2个十六进制数字。如:\x30 含义:0 |
- \' 对单引号进行转义,例如要打印字符 ‘,不能直接printf("%c",'''),这样打印时,前面两个单引号''会认为是一对单引号,最后面一个单引号就落单了,就会出现问题。我们希望中间的单引号是普普通通的单引号,而不是一对单引号中的单引号,这时让它转义,在中间单引号前加一个\就可以了,例如printf("%c",'\''),这时中间的单引号就是普普通通的字符了。
- \" 对双引号进行转义,转换含义同上,例如要打印字符串 ”,不能直接printf("%s" , “”“),这样打印时,前面两个双引号“ ”会认为是一对双引号,最后面一个双引号就落单了,就会出现问题。我们希望中间的双引号是普普通通的双引号字符,而不是一对双引号中的双引号,这时让它转义,在中间双引号前加一个\就可以了,例如printf("%s" , “\”“),这时中间的双引号就是普普通通的字符串了。假如要打印双引号之间的单引号,这样就不需要转义了,因为中间的单引号不会和前后的双引号组成一对。
- \\ 对转义字符中的\进行转义,使得这个后面的\保留原来输出格式
- \ddd d是8进制数字(0-7),\后面可以是1-3个d。当\ddd是字符,以字符形式打印时。\后面跟上三个数字,是把ddd这个8进制数字转换成十进制所得的数字,以他为ASCII码值代表的字符进行输出。
- \xdd d是16进制数字(0-F),\x后面必须是两个dd。
【补充】
printf在打印数据的时候,可以指定打印的格式。
printf("%d",100) //打印整型变量
printf("%c",'a') //打印字符
printf("%s","abdc") //打印字符串
3.3 注释
- C语言风格的注释 /*xxxxxx*/ 缺陷:不能嵌套注释
- C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行
4、选择语句、循环语句、函数后面详细讲解
5、数组
数组含义:一组相同类型的元素的集合。
5.1 数组创建
创建整型数组 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
创建字符数组 char ch[5] = {'a','b','c'}; //不完全初始化,arr有5个元素,但是初始化时只给三个元素,剩下的会默认初始化为0。
5.2 数组的访问
数组是用下标来访问的,数组的每个元素都有一个下标,下标是从0开始的。
5.3 数组的打印
要把数组全部打印出来,就要产生下标0-9范围的值
利用循环语句(for循环,或while循环)产生数组的下标,然后进行打印。
6、操作符
操作符类型 | 操作符 | 说明 |
算术操作符 | + - * / % |
/ 除号两端都是整数时,执行整数除法,算出的是商;两端有一个小数,执行的是小数除法,就会的得到小数。 % 取模(求余),得到的是余数 |
移位操作符 | << >> | 移动的是二进制位 |
位操作符 | & | ^ | |
赋值操作符 |
= += -= *= /= &= ^ = |= >>= <<= |
|
单目操作符 |
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置 -- ++ 前置、后置 ++ * 间接访问操作符 ( 解引用操作符 ) ( 类型 ) 强制类型转换 |
|
关系操作符 |
> >= < <= != 用于测试 “ 不相等 ” == 用于测试 “ 相等 ” |
|
逻辑操作符 |
&& 逻辑与 || 逻辑或 |
|
条件操作符 | exp1 ? exp2 : exp3 | |
逗号操作符 | exp1 , exp2 , exp3 , …expN | |
下标引用、函数调用和结构成员操作符 | [ ] ( ) . -> |
(1)!逻辑反操作
说明:C语言0表示假,非0就是真。!的作用是把假(0)变成真(1),把真(非0)变成假(0)。当把假取反变成真的时候,规定结果为1。
使用方法:当a为真,要做某一件事情的时候,判断语句中就是(a);当表达a为假做某件事情的时候,判断语句中就是(!a)。
(2)sizeof
说明:sizeof是一个操作符,不是函数;用来计算类型、变量、数组的大小。Sizeof()后面的括号可以省略,可说明sizeof是一个操作符,不是函数。Sizeof求变量大小的时候括号可以省略,求类型的时候不可以省略。
使用方法:计算数组大小的时候,sizeof计算的结果是数组的总大小,单位是字节,计算出的结果等于元素个数x每个元素所占字节数。数组元素个数的计算:sizeof(arr)/sizeof(arr[0])。
(3)~按位取反
对一个数的二进制按位取反。把所有二进制位中数字,0变成1,1变成0。按位取反是所有位都变,包括符号位。
(4)++
++a:前置++,先++,后使用
a++:后置++,先使用,后++
(5)exp1?Exp2:exp3 条件操作符
三目操作符,有三个操作数。Exp1成立,exp2计算,整个表达式的结构是:exp2的结果。
Exp1不成立,exp3计算,整个表达式的结构是:exp3的结果。
(6)逗号表达式
逗号表达式的特点:从左向右依次计算。
逗号表达式的结果:整个表达式的结果是最后一个表达式的结果。
7、常见关键字
【注】Define 和include不是关键字。这两个是预处理指令
7.1 typedef 类型重定义
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
unsigned int num = 100;
typedef unsigned int u_int//将unsigned int 类型重新起一个名字u_int
7.2 static 静态的
Static的三个用法:
- static 修饰局部变量——称为静态局部变量
- Static 修饰全局变量——-称为静态全局变量
- Static 修饰函数——称为静态函数
1、static修饰局部变量
改变了局部变量的生命周期(本质上是改变了变量的存储类型),当被static修饰时,局部变量由栈区存放到了静态区。因为存在了不同区域,数据就有了不同的特点。静态区中全局变量和static 修饰的静态变量的生命周期非常长。他们的生命周期和程序的生命周期是一样的,程序不结束,全局变量和静态变量就不会销毁。下图为变量的存储。
2、static修饰全局变量
static修饰的全局变量,使得这个全局变量只能在自己所在的源文件(.C)内部可以使用,其他源文件不能使用。
本质:全局变量在其他源文件内部可以被使用,是因为全局变量是具有外部链接属性,但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了。
下图所示,用static修饰全局变量后,test.c程序中无法使用g_val变量。
3、static修饰函数
static修饰函数后,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用。
本质上,static是将函数的外部链接属性变成了内部链接属性,和static修饰全局变量一样。
static修饰函数后:
8、 #define 定义常量和宏
说明:宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式,解释器或编译器在遇到宏时会自动进行这一模式替换。
作用:
(1)define 定义符号/定义常量
(2)define定义宏,define定义的宏完成的是替换。宏是有参数的,宏的参数是替换。
#define MAX 1000
#define ADD(X,Y) ((X)+(Y)) //宏在书写的时候,不应该把X和Y想象成一个普通的变量,它可能是一个表达式,需要把宏体整体括起来。
9、指针
9.1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
内存的管理方式:把内存划分为一个一个小格子,然后给每个小格子编上号。
(1)内存的编号方式
所说的机器是32位的或64位的,32位指的是有32根地址线。地址线是物理线,是可以通电的,正电时1,负电0,可把电信号转换成数字信息:1和0组成的二进制序列。是因为有地址线,地址线通电产生的电信号,电信号转换成数字信号对应的二进制序列就是地址编号。编号就被称为地址。
(2)一个这样的内存单元是多大空间呢?
一个内存单元的大小为1个字节byte,然后再去分配地址。
9.2 指针变量
创建一个变量a为int类型,它在内存中占用四个字节,在内存中给每个字节都分配了一个地址。现在想拿出它的地址。它是怎样一个地址呢?
用&取出a的地址,取地址是取的是这四个连续空间的起始地址。只要拿到连续空间的起始地址,后面的地址照样可以找到。取地址时,不是把四个地址都拿出来,只会把第一个字节的地址拿出来
%p:专用用来打印地址的。printf(“%p\n”,&a)
将地址取出来后,它虽然是个地址,但也是一个值,这个值要存起来,就需要放到一个变量中去,用来存放地址的变量叫做指针变量。
指针变量定义,int * pa = &a。 对于int * 的理解:*说明pa是指针变量;int说明pa指向的对象a是int类型的。pa指向的是a,a的类型是int,所以指针变量是int类型。
指针变量是用来存放其他变量地址的,指针是有类型的,指针的作用:第一是用来存放地址,第二是可以通过* pa来找到它所指向的对象,来操作它所指向的对象。* 叫做解引用操作符。* pa就是通过pa里的地址找到a,然后可以对a进行操作,这种是简介操作。
9.3 指针变量大小
指针大小在32位平台是4个字节,64位平台是8个字节
10 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。结构体可以让C语言创建新的类型。
(1)结构体创建和初始化
(2)结构体的访问(如上图所示):
(a)点操作符: 结构体变量.成员变量
(b)箭头操作符:->,通过结构体指针来访问。结构体指针->成员变量名
ps是指针,它指向对象的名字ps->name。
结构体指针定义:Struct stu * pa = &s
【鹏哥C语言网课笔记】初识C语言相关推荐
- 【鹏哥C语言网课笔记】初识指针
目录 一.指针是什么? 二.指针和指针类型 三.野指针 指针未初始化 指针越界 指针指向的空间释放 如何规避野指针 四.指针运算 指针+-整数 指针-指针 指针的关系运算 五.指针和数组 六.二级指针 ...
- 【鹏哥C语言网课笔记】习题总结1
目录 1 习题1:将输入的字符进行打印 2 getchar清理缓冲区 3 计算1!+2!...+n! 4 在有序数组中查找具体某个数字 5 编写代码多个字符从两端向移动,向中间汇聚 6 编写代码,模拟 ...
- 【鹏哥C语言网课笔记】初始结构体
目录 结构体类型的声明 结构的基础知识 结构的声明 结构成员的类型 结构体变量的定义和初始化 结构体成员访问 结构体变量访问成员 结构体指针访问指向变量的成员 结构体传参 结构体类型的声明 结构的基础 ...
- 学堂在线部分网课笔记---Web设计与应用
学堂在线部分网课笔记 Web设计与应用 第六章 敏捷的前端框架 6.2.1 bootstrap响应式布局(一) 容器 非固定宽度 固定宽度 Viewport viewport的作用是什么? width ...
- 吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己
吴恩达ChatGPT网课笔记Prompt Engineering--训练ChatGPT前请先训练自己 主要是吴恩达的网课,还有部分github的prompt-engineering-for-devel ...
- 第一课:初识Java语言
第一课:初识Java语言 一.了解Java的历史由来. 1.为什么学习Java编程语言. (1)首先要了解编程语言的流行趋势,Tiobe.PYPL排行榜. (2)在这些排行榜上,Java语言的流行程度 ...
- 大学计算机基础网课笔记,网课笔记怎么做?hiter教你!
原标题:网课笔记怎么做?hiter教你! 转眼间 线上开课已一月有余 大家对 网课已相当熟悉了 小编随机调查了部分同学的网课状态 发现我工同学上网课毫不含糊 做起笔记来也是相当精彩 下面就随小编一起来 ...
- c语言作业系统输出超限,C语言网Online Judge系统支持语言和编译说明
Online Judge系统支持语言和编译情况: 语言 编译器 语言版本 编译参数 C gcc 4.6.3 C99 gcc Main.c -o Main -Wall -lm –static -std= ...
- C语言基础1:初识C语言(转义、注释;数组、操作符、反码、补码、static、define、指针、结构体常变量;局部变量;作用域、生命周期)
文章目录 C语言基础1:初识C语言 1.C语言简介 1.1什么是C语言 1.2C语言的发展 2.第一个C语言程序 2.1创建项目 2.2添加源文件 2.3写代码 3.数据类型 4.变量.常量 4.1定 ...
最新文章
- 大学加权平均分计算器_墨尔本大学商学院(MBS)2021研究生、博士、本科、预科录取要求更新...
- 多层AOP 解决AOP执行顺序
- vscode 插件设置
- python poll_python IO 多路复用 select poll epoll
- (五)boost库之随机数random
- hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题
- 二元偏导数存在的条件_多元函数 可导、可微、连续、一阶偏导数连续 之间关系的总结...
- Binding是WPF的核心,WPF的常用数据源绑定有四种
- javascript获取事件源对象和产生事件的对象
- 【博客项目】—密码加密( 六)
- 安装slide后Powerpoint 不自动退出的解决方案
- linux音频设备节点,Linux音频驱动之三:PCM设备的创建
- Ubuntu命令大全(转载)
- 最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?
- 运算放大器权威指南(第3版) (op amps for everyone)_OP高质量,ED多版本,有钱的动物狂想曲就是能为所欲为...
- word中插入分割线
- iOS 21种设计模式之工厂模式
- 任务定义的脑网络的内在连接模式可以个体化预测精神分裂症患者的认知症状维度
- 基于JAVA口红专卖网站计算机毕业设计源码+数据库+lw文档+系统+部署
- VirtualBox-ubuntu系统下挂载U盘
热门文章
- 工业互联网(十四)——相机标定(Camera calibration)原理、步骤
- nginx解决内外网隔离无法访问外网web地址问题
- 2023年裁员潮即将来临,当下年轻人该如何自救?官方为此做出回应
- java火柴游戏_Java课程设计—拿火柴小游戏
- ASP.net创建Controller视图时报错(Exception has been thrown by the target of an Invocation.)
- HTML中地图根据数据变色,echarts中国地图根据数据对省份渲染不同的颜色
- SQL添加字段、删除字段、调整字段顺序
- 用动态规划算法解决TSP问题
- Qt 界面加载卡顿或刷新问题
- [笔记] JSP 与 JSPX 语法差异对比 [草稿,待续]