- 博客(57)
- 资源 (1)
- 收藏
- 关注
原创 预处理指令include
预处理指令 #include 有两种形式:1、文件名在尖括号内:在编译器包含目录搜索文件,如: #include <stdio.h>2、文件名在双引号内:先在当前目录搜索文件,若不存在再去编译器包含目录搜索,如:#include "print.c"对于stdio.h头文件,一般由编译器自带,因此用 <stdio.h>直接在编译器包含目录搜索此文件//#include <stdio.h> //在编译器目录查找stdio.h头文件#include "s.
2022-05-16 19:19:56
1375
原创 预处理指令if、ifdef、ifndef
#if、#ifdef、#ifndef预处理指令没有使用花括号{},因此需要以#endif作为结束。对于不满足的代码块会直接被预处理器删除(切记是删除)#include <stdio.h>/*时间:2022-05-16 16:48作者:sgbl888功能:预处理指令#if..#elif..#else..#endif、#ifdef...#endif、#ifndef知识点: 1、本节讲的预处理指令没有使用花括号,因此需要以#endif结束 2、本节讲的预处理指令满足
2022-05-16 17:10:03
1044
原创 typedef给类型起别名
typedef本身并不会创建新的类型,只是给原的类型起个别名而已。一般形式为:typedef原类型别名typedef int int_32;int_32 a = 5, b = 6; //与int a = 5, b = 6;是一样的typedef几点注意事项:typedef本身没有创建新类型,只给原有类型起个别名typdef不像define,define被预处理器替换,typedef不会被预处理器替换typedef给struct、union起别名时,声明结构体、联合体时就...
2022-05-16 15:39:36
852
原创 预处理指令define和undef
#define是由预处理器进行处理的。预处理指令以#号开头以区分其它语句,因只有一行末尾不需要以;分号结束。#define PRICE 3.2int main(){ int num = 100; float total= PRICE * num; //预处理后将替换为 float total = 3.2 * num;return 0;}其形式为:#define宏替换体宏函数一、替换体前带#号,#号将会以双引号把替...
2022-05-16 15:02:35
598
原创 枚举enum(整型常量的集合)
枚举enum是一组被命名的整型常量的集合,是C语言中的一种基本类型。我们平常的星期一到星期日便可声明为枚举enum类型。注意:如果枚举成员不设置初始值,默认从0开始累加 也可给每个枚举成员设置初始值 枚举成员的值只能是整型(正负数都可以) #include <stdio.h>/*时间:2022-05-13 18:51作者:sgbl888功能:枚举enum知识点: 1、如果枚举成员不设置初始值,默认从0开始累加 2、也可给每个枚举成员设置初始值 3
2022-05-13 19:06:06
997
原创 联合体union 亦可称为共用体
联合体union<称为共用体亦可>是C语言的一种特殊的结构类型。与结构体struct很相似,除了共同内存、名称不一样,其它使用基本上都一样,包括指针等。注意点:union它的成员是共用同一块内存(若对一个成员赋值,其它成员会被覆盖掉) union它占用的字节数,是union成员级别最高的类型占用的字节数 union类似于其它语言的变体(如既可赋值int类型、赋值float类型、字符串类型等)union联合体名称{ 成员列表};#include &l...
2022-05-13 16:34:22
409
原创 匿名结构struct
匿名结构即为没有名字的struct,一般作为其它struct成员使用。#include <stdio.h>#include <string.h>/*时间:2022-05-13 16:02作者:sgbl888功能:匿名结构知识点: 1、 2、 3、*//* struct conact{ char email[30]; //邮箱 long long phone; //电话号码}; */struct Student{
2022-05-13 16:15:30
648
原创 结构struct与函数
结构变量也可作为函数的实参传递。函数指针也可作为结构体的成员。#include <stdio.h>/*时间:2022-05-11 19:58作者:sgbl888功能:结构与函数知识点: 1、结构变量可作为函数的参数 2、函数指针也可作为结构体的成员 3、*/struct Student{ char name[20]; int num; //学号 float score; //成绩 void (*sty)(); //函数
2022-05-11 20:18:31
231
原创 结构与指针
当一个指针变量指向一个结构变量,这个指针就成了结构指针变量语法如下:struct 结构名称 * 结构指针名称struct Student * pst; //定义一个结构指针变量pst注意点:结构变量名不会转为内存首地址 数组名会转为内存首地址结构指针变量访问方式:(*结构指针名称).成员名称 结构指针名称->成员名称 点号 .优先级高于星号 *#include <stdio.h>/*时间:2022-05-11 19:19作者:sgbl88.
2022-05-11 19:37:36
164
原创 结构struct嵌套
结构还可以嵌套结构,但不能嵌套自身(嵌套自身的指针除外)#include <stdio.h>/*时间:2022-05-11 19:08作者:sgbl888功能:结构嵌套知识点: 1、不能嵌套自身结构 2、可以嵌套自身结构指针 3、*/struct conact{ char email[30]; //电子邮件 unsigned long long int phone; //联系电话};struct Student{ ch
2022-05-11 19:18:07
1258
原创 结构struct数组
结构体struct也是一种数据类型,它也可以作为数组元素的类型结构数组定义 定义形式:struct 结构名称{ 成员列表}数组名称[元素个数];struct Student{ char name[20]; short num; float score;}sar[2]; //有2两个元素的结构数组结构数组初始化: struct Student{ //Student为结构体名称 char name[...
2022-05-11 19:03:48
3533
原创 结构体struct初始化、访问
结构成员访问: 虽然结构类似于数组,数组是由相同类型组成,而结构是可由不同类型组成的。数组可通过下标访问,但结构体不能。结构要访问成员,须通过结构成员运算符.点号struct Student{ //Student为结构体名称 char name[20]; //学生姓名 int num; //学生学号 float score; //学生成绩};struct Student st1; //定义结构体变量st1strcpy(s...
2022-05-11 17:48:39
361
原创 结构体struct声明、定义
结构体是一种构造类型(结构体、数组、联合类型),结构体弥补了数组不能存储多种类型的缺陷(即结构体是由于相同类型或不同类的成员组成)一般声明形式如:struct 结构体名称 {成员列表};struct Student{ //Student为结构体名称 char name[20]; //学生姓名 int num; //学生学号 float score; //学生成绩};上面声明了3个不同类型成员的结构体,每个成员以 ...
2022-05-11 17:19:01
3018
原创 字符指针与字符串
字符串与字符数组几个注意点:字符串本质是字符数组,以\0结尾。sizeof("hello);结果是6而非5,因为后面多一个\0的结束符 字符串常量是不可修改。char * str = "hello"; *str = 'H';是错误的 不能对字符数组名进行运算。如:char str[3] = "ha"; str++;也是错误的 字符串结束是数值0(ASCII码值0),而不是字符'0'(ASCII码值48)。为了不与数值0冲突,用转义符\0表示 //初始化列表长度小于字符数组长度char str
2022-05-09 16:52:11
417
原创 void指针
void指针是一种不确定类型的指针,任何指针都可转换为void指针。前面的文章说过,指针有两个非常重要的信息:指针的值(指针目标对象的内存首地址) 指针指向对象的类型注意点:void指针只保存了 指针的值并没有记录指针指向对象的类型。因此在用到对void指针解引时,需要先把void指针转换成原本的数据类型。如:int n = 500; //定义一个int变量int * p = &n; //定义int类型指针void * pv = p; //定义void指针,只保存了..
2022-05-03 18:31:21
4717
原创 const关键字修饰的对象
我们知道const是常量的意义,下面详解一下const在不同场景的用途一、const修饰基础类型,此变量的值无法被修改。int a = 5; //此时可修改,若改为const int a = 5 或 int const a = 5 就无法修改其值二、const修饰指针当const在*号左边时,const修饰的是指针指向的数据(无法修改其值)。const int * p1 = &a; //无法通过 *p1 = 6 改变指针指向的值。可通过 p1 = &b改变指...
2022-05-03 15:09:11
1234
原创 函数指针数组
函数指针与数组:即把函数的指针作为数组元素语法:函数返回值类型 (*函数标识[数组元素个数]) (函数形参) = {数组元素1,元素2...};#include <stdio.h>/*时间:2022-05-01 16:09作者:sgbl888功能:函数指针与数组(根据输入的数字播放电影)知识点: 1、 2、 3、*/void yzwc(){ printf("1、雍正王朝\n");}void dmwc1566(){ print
2022-05-02 16:41:34
308
原创 初步学习函数指针
函数指针:函数类型的指针,首先是一个指针,指向的是一个函数。语法如下:函数返回值类型 (*指针标识) (函数形参) = 函数标识;如:int (*pmax) (int x, int y)() =Max; //函数名称在表达式中会转换为函数的指针#include <stdio.h>/*时间:2022-05-02 16:10作者:sgbl888功能:函数指针知识点: 1、函数名称在表达式中会转换为函数的指针 2、可把函数声明的函数名称换成 (*函数指针名称
2022-05-02 16:24:33
307
原创 数组指针与二维数组
数组指针:理解为数组类型的指针,首先是一个指针,指向的是数组(中国人修饰词往往放在前面,而西方往往放在后面)。语法(为了区分数组指针和指针数组,数组指针用()括起):目标数据类型 (*指针名称)[目标数组大小]。如 int (*p)[3]#include <stdio.h>/*时间:2022-04-30 19:30作者:sgbl888功能:数组指针知识点: 1、数组指针首先是一个指针,指向的是数组 2、 3、*/int main(){
2022-04-30 20:01:35
271
原创 指针与二维数组名关于地址相同的问题解答
指针有两个非常重要的信息:指针的值是目标对象的内存首地址 指针的类型是目标对象数据的类型这两个信息若忘掉其中一点,很容易把指针与多维数组搞乱。我自己开始学习指针与二维数组时就感觉学得有点乱。只要是体现在指针移动的问题(就是把指针第二个重要信息忽略了)。把指针的类型对应的步长搞明白了,指针移动也就理解清楚了上图中,虽然p1、p2、p3打印出来的内存首地址全部相同,但步长是完全不同。主要是指针的类型决定了指针移动的步长。可以分别对上面三个地址+1,就很显示看出是不同的。#includ.
2022-04-30 16:21:23
901
原创 指针数组(指针类型的数组)
顾名思义:指针类型的数组,首先是一个数组,数组元素存储的是指针。语法如下:目标类型 数组名称[元素个数]如:int * p[3] 数组p有3个元素,每个元素存储的都是指针类型int a[] = {1, 3, 5}; //定义数组aint* p[3]; //定义指针数组p,有三个元素,每个元素存储都是指针类型p[0] = a; //或 &a[0]p[1] = &a[1]; //或 a+1p[2] = a + 2; //或 &a[2]为什么 &
2022-04-28 16:10:36
24199
2
原创 函数中返回指针、函数中返回多个变量
函数中返回指针及关键字static:int* func(); //函数声明,或叫函数原型。int main(){ int* n = func(); printf("n = %u\n", n); return 0;}int* func(){ int n1 = 100; //函数结束时,n1被回收 //static int n1; //加上static关键字,函数结束时不会被回收 return &n1; //返回指针}上面结果运行时会报
2022-04-20 17:17:16
204
原创 多级指针与指针数组(arr、&arr、&arr[0]的区别)
级指针:即一个指针类型变量存储了另一个打针类型变量int n = 100;int* pn = &n; //pn是一个指针类型变量,其值是变量n的内存首地址,其类型为int*int** pnn = &pn; //二级指针,指针pnn又存储了指针pn的内存首地址int*** pnnn = &pnn; //三级指针,pnnn指向了pnn指向关系:pnnn->pnn->pn->n(100)pn指向变量n,*pn取得变量n对应的内容100pnn指向
2022-04-20 16:55:27
1498
原创 指针与数组(移动指针访问数组)
通过对指针加减运算也就是指针移动,可以很方便的对数组元素修改或访问。步长:指针指向的类型所占用空间大小,即sizeof(类型) 指针类型 + n ,内存首地址将会向后移动 n * 步长 字节 指针类型 - n ,内存首地址将会向前移动 n * 步长 字节 数组名如果出现在表达式中,数组名将会转换为数组第一个元素的内存首地址。但sizeof和&例外。 数组[下标]最终会展开为:数组 +下标。如:arr[2]、2[arr]将展开为:arr+2、2+arr相当于*(arr+2)#inc..
2022-04-18 10:33:04
1133
原创 指针运算(指针移动)
指针类型存储了两个重要信息:目标数据对象在内存中的首地址 目标数据对象所占用的空间大小 sizeof(类型)内存地址是从0开始,依次加1的整型数据。那我们可以对指针类型进行运算(指针移动)吗?同类型的指针乘除 同类型的指针相加 指针类型与整型乘除以上三点是无法通过编译且无意义的。另外函数内的变量不能保证在内存中是首尾相接的,只有数组才能保证每个元素是连续存储的。#include <stdio.h>/*时间:2022-04-16 21:31作者:sgbl888功能.
2022-04-17 14:29:30
1089
原创 初步学习C语言指针
指针即存储了目标数据对象的内存首地址和目标数据对象所占用的空间大小。#include <stdio.h>/*时间:2022-04-16 19:04作者:sgbl888功能:初步学习指针(存储了另一个数据对象的内存首地址及所占用空间大小)知识点: 1、&符号是取数据对象的内存首地址 2、*符号是对对应的数据对象内容取值或改值 3、%p是指针专用占位符(以十六进制输出) 4、32位系统指针占用4个字节,64位系统指针占用8个字节 5
2022-04-16 19:58:30
600
原创 函数递归学习方法
函数递归(Recursion):即函数中直接或间接的调用自己的行为称为递归。递归如果不设置结束条件就会无限执行,跟循环结构的死循环一样,最后卡死。来一张自己制作的利用递归计算阶乘(比如4的阶乘=4*3*2*1)的分解图:下面的代码段中有几个递归实例:#include <stdio.h>/*时间:2022-04-14 11:34作者:sgbl888功能:递归学习知识点: 1、求1+2...+100的和 2、求5的阶乘 3、打印99乘法表,从9
2022-04-15 16:12:59
240
原创 C语言函数初步学习
函数是把一段有特定功能的代码进行封装,方便重复调用。在现实例子中,我们可把函数看作一台碾米机(可能不太准确)。你放入一些稻谷(函数输入参数),机器会把稻谷去壳的过程(函数体),最后输出白大米给你(返回值)看代码段:#include <stdio.h>/*时间:2022-04-13 19:35作者:sgbl888功能:学习C语言自定义函数知识点: 1、若声明的函数在调用处之后,须使用函数声明,否则会报错。函数声明可省略形参标识 2、无返回值的函数类型为 vo
2022-04-13 19:53:46
870
原创 输入输出缓存及输入输出函数
for(int i = 0; i < 4; i++){ printf("hello world %d\t", i); //字符串不加\n Sleep(500); //500毫秒 //usleep(1000 * 500); //类unix平台使用。单位为微秒,1000微秒=1毫秒 }上面这段代码在windows和类unix下执行,得到的效果并不一样。windows正常输出,而类unix则是等待一会一次性输出。为什么会这样呢?因为两个平...
2022-04-13 16:43:37
284
原创 字符数组与字符串
#include <stdio.h>#include <string.h> //用到strlen函数/*时间:2022-04-12 16:03作者:sgbl888功能:字符数组知识点: 1、测量字符数组或字符串长度使用strlen函数,不要使用sizeof 2、sizeof更多用于测量占用字节,而非计算字符串长度 3、getchar函数是输入一个字符 4、putchar是输出一个字符*/int main(){ //声明字符数组.
2022-04-12 17:02:33
174
原创 C语言:二维数组及所占用的字节
以数组作为数组的元素“数组中的数组”即二维数组。语法如下:类型 数组标识[一维数组长度][二维数组长度] 如:float rain[5][12]二维数组占用的字节数计算方法为:二维数组单个元素所占的字节 *元素个数。上面声明的rain[5][12],共5*12=60个元素,float类型占用4个字节,因此为 4*60=240个字节。下面的代码片段有两个实例,一个计算5年的总降水量、5年中月平均降水量:#include <stdio.h>/*时间:2022-04-10 .
2022-04-11 15:04:46
8272
原创 C语言:初识数组及数组的复制
什么是数组?数组是由相同类型(记住是相同,不同类型不可以)的一系列数据组成。基本上C语言变量可用的类型,在数组也可使用。数组的语法如下:类型数组标识[长度] ,其中数组的长度或元素个数用方括号括起。如:int arr1[10],声明了10个元素的数组。数组的初始化用花括号把数据括起来,每个数据以逗号分隔。如:int arr1[5] = {1,2,3,4,5}。其中 {1,2,3,4,5}为初始化列表 数组要赋值或使用,需要通过数组的下标(索引)的方式,且数组的下标是从0开始到数组长度减1结束.
2022-04-10 19:29:55
8372
原创 多重选择switch
switch语法如下:switch(整型表达式){case 整型常量://执行代码break; //可选case 整型常量:case ...default: //可选}下面看代码,代码中有注释:#include <stdio.h>/*时间:2022-04-09 18:52作者:sgbl888功能:学习switch,语法如下: switch(整型表达式)...
2022-04-09 19:18:12
593
原创 循环辅助:continue、break
一、continue是跳过本次循环(非中止),如果是在for中使用continue还会继续更新计数器二、break是中止它所在位置的本层循环,如果是在for中使用是不会更新计数器的下面来个实例代码:#include <stdio.h>/*时间:2022-04-08 19:16作者:sgbl888功能:循环辅助continue和break知识点: 1、break只能中止它所在位置的循环,无法用一个break退出多重循环。break后不会再更新计数器 2、co
2022-04-08 19:34:30
181
原创 代码流程:循环结构
循环:即循环条件成立,重复执行循环体的代码,直到循环条件不成立。C语言有三种循环结构:while循环,do...while循环、for循环循环需要注意的几点:不设置循环、循环永远成立、非0循环条件将会造成死循环,导致设备卡死 一般情况下,对循环设置有限次数的循环条件 循环结构可以嵌套,循环、分支也可相互嵌套 循环与分支结构一样,只对循环后面的一条语句生效,如果需要执行多条语句,可用花括号组成一条复合语句 do...while至少执行一次。while(循环条件)后面需要以;号结束#
2022-04-08 19:07:39
398
原创 C语言:代码控制流程、if分支流程、条件运算符
C语言控制流程分为三种,分别是:顺序流程、分支流程、循环流程顺序流程:代码自上而下执行 分支流程:根据测试条件,执行满足条件的代码。如:if...else if...else、switch 循环流程:根据测试条件,重复执行代码。如:for循环、while循环等条件运算符(C语言唯一的三目运算符),可简化if...else。条件运算符原型:测试条件 ?条件成立执行 :条件不成立执行下面我们来学习下分支流程的if...else if...else,具体看代码段:#include &...
2022-04-08 16:07:41
1034
原创 C语言:关系与逻辑运算符、运算符优先级
一、关系运算符和数学是一样,分别有:大于 > 、小于 < 、大于等于 >= 、小于等于 <= 、等于 == 、不等于 !=。因=号且作赋值符因此用两个=号作为 等于 号。二、逻辑运算符分别有:与运算符&&、或运算符||、取反运算符!&&是需要两边的运算都为1(真),结果才是真,若有一个为假结果就是假(0) ||是只需要两边的运算其中有一个为1(真),结果就是真,两个都为假才是假(0) !是取反向值,如!1,把真取反就...
2022-04-06 19:14:44
25846
3
原创 C语言:强制类型转换、自动类型转换
C语言中类型转换有两种方式:即强制类型转换和自动类型转换。一、强制转换比较简单,为:(类型)操作对象。int n1 = 5, n2 = 2;float f1 = (float) 5 / 2; //结果为2.5000,若不强制转换结果为2.000其它类型的自动转换这个一样二、自动类型转换有以下几个规则类型级别低于等于int的,运算结果为int类型。高于int类型,保持高级别类型 无符号类型级别高于有符号类型(unsigned > signed) 浮点型级别高于...
2022-04-06 16:14:26
9658
1
原创 C语言运算符,还有运算符的额外作用
C语言运算符有+、-、*、/、++、--、%、=(位运算符、关系运算等后面再讲解)加减乘除这边都不讲,日常使用频繁不再讲解。主要讲解一下其它几个运算符及一些特殊点:减号是可以对结果产生改的(参考代码段第15行),加号则不会 自增、自减分为:前缀自增、自减和后缀自增自减(主要是额外作用产生的时机不同) %号是对数据进行取余数下面具体来看代码段(有详细注释):#include <stdio.h>/*时间:2022-04-04 19:12作者:sgbl888功能:运算符、表
2022-04-04 20:02:03
634
原创 学习可变参函数scanf
scanf是C语言定义的一个可变参数的输入函数,与printf相对应,在使用上跟printf也很相似。scanf第一个参数必须是字符串及占位符(规范转换) scanf第二个及后续参数是用来接收输入数据的变量或字符数组(变量需要加上&号取变量址,字符数组则不需要,因字符数组本身就是引用类型) scanf第二个及后续的变量或字符数组须与规范转换的类型、数量相匹配 C语言没有字符串类型,可用字符串数组,如:char str[10]下面来段代码演示下:#include <stdio.
2022-04-03 19:58:58
770
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人