0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言的具体结构与基本数据类型

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2022-06-22 15:35 次阅读

C语言入门程序hello world

#include int main(){/*在双引号中间输入Hello World*/printf("HelloWorld");//在屏幕打印输出Hello Worldreturn 0; }

注:在最新的C标准中,main函数前的类型为int而不是void

C语言的具体结构

简单来说,一个C程序就是由若干头文件和函数组成。

f295a838-efae-11ec-ba43-dac502259ad0.png

#include 就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。

函数就是实现代码逻辑的一个小的单元。

必不可少之主函数

一个C程序有且只有一个主函数,即main函数。

f2a5f3c8-efae-11ec-ba43-dac502259ad0.png

  • C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口

  • 而main前面的int就是主函数的类型

  • printf()是格式输出函数,这里就记住它的功能就是在屏幕上输出指定的信息

  • return是函数的返回值,根据函数类型的不同,返回的值也是不同的

  • 是转义字符中的换行符。(注意:C程序一定是从主函数开始执行的)

写代码的良好习惯

  • 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行

  • 函数体内的语句要有明显缩进,通常以按一下Tab键为一个缩进

  • 括号要成对写,如果需要删除的话也要成对删除

  • 当一句可执行语句结束的时候末尾需要有分号

  • 代码中所有符号均为英文半角符号

f2b8306a-efae-11ec-ba43-dac502259ad0.png

程序解释——注释

注释是写给程序员看的,不是写给电脑看的。

C语言注释方法有两种:

多行注释:/*注释内容*/
单行注释://注释一行

C标识符

C语言规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,并且第一个字符必须是字母或下划线。在使用标识符时还有注意以下几点:

  • 标识符的长度最好不要超过8位,因为在某些版本的C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为是同一个标识符

  • 标识符是严格区分大小写的。例如Imooc和imooc 是两个不同的标识符

  • 标识符最好选择有意义的英文单词组成做到"见名知意",不要使用中文

  • 标识符不能是C语言的关键字。想了解更多C语言关键字的知识

变量定义与赋值

变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前必须先定义变量,要区分变量名和变量值是两个不同的概念。

f2cd42de-efae-11ec-ba43-dac502259ad0.png

变量定义与赋值的一般形式如下。

f2d819e8-efae-11ec-ba43-dac502259ad0.png

注意:在定义中不允许连续赋值,如下操作是不合法的。

int a=b=c=5; //不合法的赋值操作

变量的赋值分为两种方式:

  • 先声明再赋值

  • 声明的同时赋值

基本数据类型

C语言中的数据类型如下图所示。

f2e4314c-efae-11ec-ba43-dac502259ad0.png

最常用的整型、实型与字符型(char,int,float,double):

f2ece206-efae-11ec-ba43-dac502259ad0.png

整型数据是指不带小数的数字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):

f2f9a5e0-efae-11ec-ba43-dac502259ad0.png

注意:

  • int short int long int是根据编译环境的不同,所取范围不同

  • 而其中short int和long int至少是表中所写范围, 但是int在表中是以16位编译环境写的取值范围

  • 另外 c语言int的取值范围在于他占用的字节数 ,不同的编译器,规定是不一样

  • ANSI标准定义int是占2个字节,TC是按ANSI标准的,它的int是占2个字节的。但是在VC里,一个int是占4个字节的

浮点数据是指带小数的数字。

生活中有很多信息适合使用浮点型数据来表示,比如:人的体重(单位:公斤)、商品价格、圆周率等等。

因为精度的不同又分为3种(float,double,long double):

f303d6aa-efae-11ec-ba43-dac502259ad0.png

格式化输出语句

格式化输出语句,也可以说是占位输出,是将各种类型的数据按照格式化后的类型及指定的位置从计算机上显示。其格式为:

printf("输出格式符",输出项);

f30db2e2-efae-11ec-ba43-dac502259ad0.png

当输出语句中包含普通字符时,可以采用一下格式:

printf("普通字符输出格式符", 输出项);

f319258c-efae-11ec-ba43-dac502259ad0.png

注意:格式符的个数要与变量、常量或者表达式的个数相对应。

不可改变的常量

在程序执行过程中,值不发生改变的量称为常量,比如:

f327fe36-efae-11ec-ba43-dac502259ad0.png

在C语言中,可以用一个标识符来表示一个常量,常量在使用之前必须先定义,其一般形式为:

#include #define POCKETMONEY 10    //定义常量及常量值int main(){// POCKETMONEY = 12;  //小明私自增加零花钱对吗?printf("小明今天又得到%d元零花钱
", POCKETMONEY);return 0;  }

符号常量不可以被改变。

自动类型转换

数据类型存在自动转换的情况。

自动转换发生在不同数据类型运算时,在编译的时候自动完成。

f33b4658-efae-11ec-ba43-dac502259ad0.png

char类型数据转换为int类型数据遵循ASCII码中的对应值。

注意:

  • 字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换

  • char可以转换为int,int可以转换为double,char可以转换为double

强制类型转换

强制类型转换是通过定义类型转换运算来实现的。其一般形式为:

(数据类型) (表达式)

其作用是把表达式的运算结果强制转换成类型说明符所表示的类型。在使用强制转换时应注意以下问题:

  • 数据类型和表达式都必须加括号, 如把(int)(x/2+y)写成(int)x/2+y则成了把x转换成int型之后再除2再与y相加了

  • 转换后不会改变原数据的类型及变量值,只在本次运算中临时性转换

  • 强制转换后的运算结果不遵循四舍五入原则

C语言基本运算符

f345e810-efae-11ec-ba43-dac502259ad0.png

除法运算中注意:

  • 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2

  • 而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000

取余运算中注意:

  • 该运算只适合用两个整数进行取余运算,如:10%3 = 1

  • 运算后的符号取决于被模数的符号,如(-10)%3 = -1,而10%(-3) = 1

自增与自减运算符

自增运算符为++,其功能是使变量的值自增1。

自减运算符为--,其功能是使变量值自减1。

它们经常使用在循环中,自增自减运算符有以下几种形式:

f351845e-efae-11ec-ba43-dac502259ad0.png

赋值运算符

C语言中赋值运算符分为简单赋值运算符和复合赋值运算符。

例如:

a=3; //变量a并赋值为3a+=5; //这个算式就等价于a=a+5,将变量a和5相加之后再赋值给a

注意:复合运算符中运算符和等号之间是不存在空格的。

关系运算符

C语言中的关系运算符:

f35d4fc8-efae-11ec-ba43-dac502259ad0.png

关系表达式的值是真和假,在C程序中用整数1和0表示。

注意:>=, <=, ==, !=这种符号之间不能存在空格。

逻辑运算符

C语言中的逻辑运算符:

f369606a-efae-11ec-ba43-dac502259ad0.png

逻辑运算的值也是有两种分别为真和假,C语言中用整型的1和0来表示。其求值规则如下:

  • 与运算 &&

参与运算的两个变量都为真时,结果才为真,否则为假。例如:5>=5 && 7>5 ,运算结果为真。

  • 或运算 ||

参与运算的两个变量只要有一个为真,结果就为真。两个量都为假时,结果为假。例如:5>=5||5>8,运算结果为真

  • 非运算!

参与运算的变量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>8),运算结果为真

三目运算符

C语言中的三目运算符,其格式为:

表达式1 ? 表达式2 : 表达式3;

程序执行过程是:

判断表达式1的值是否为真,如果是真的话执行表达式2,如果是假的话执行表达式3。

运算符大比拼之优先级比较

各种运算符号的顺序:

f372789e-efae-11ec-ba43-dac502259ad0.png

优先级别为1的优先级最高,优先级别为10的优先级别最低。

分支结构之简单if语句

C语言中的分支结构语句中的if条件语句。

简单if语句的基本结构如下:

if(表达式){  执行代码块;}

其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。

注意:if()后面没有分号,直接写{}。

分支结构之简单if-else语句

简单的if-else语句的基本结构:

f37b4640-efae-11ec-ba43-dac502259ad0.png

语义是: 如果表达式的值为真,则执行代码块1,否则执行代码块2。

注意:if()后面没有分号,直接写{},else后面也没有分号,直接写{}。

分支结构之多重if-else语句

C语言中多重if-else语句,其结构如下:

f385b60c-efae-11ec-ba43-dac502259ad0.png

语义是:依次判断表达式的值,当出现某个值为真时,则执行对应代码块,否则执行代码块n。

注意:当某一条件为真的时候,则不会向下执行该分支结构的其他语句。

分支结构之嵌套if-else语句

C语言中嵌套if-else语句。嵌套if-else语句的意思,就是在if-else语句中,再写if-else语句。其一般形式为:

f3950f12-efae-11ec-ba43-dac502259ad0.png

循环结构之while循环

反复不停的执行某个动作就是江湖人称的循环 。

C语言中有三种循环结构,先看一下C语言while循环的结构:

f3a19f3e-efae-11ec-ba43-dac502259ad0.png

其中表达式表示循环条件,执行代码块为循环体。

while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体代码块。

  • while语句中的表达式一般是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行

  • 一定要记着在循环体中改变循环变量的值,否则会出现死循环(无休止的执行)

  • 循环体如果包括有一个以上的语句,则必须用{}括起来,组成复合语句

循环结构之do-while循环

C语言中的do-while循环,一般形式如下:

f3af4ba2-efae-11ec-ba43-dac502259ad0.png

do-while循环语句的语义是:

它先执行循环中的执行代码块,然后再判断while中表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。

注意:使用do-while结构语句时,while括号后必须有分号。

循环结构之for循环

C语言中for循环一般形式:

f3b8295c-efae-11ec-ba43-dac502259ad0.png

它的执行过程如下:

  • 执行表达式1,对循环变量做初始化

  • 判断表达式2,若其值为真(非0),则执行for循环体中执行代码块,然后向下执行;若其值为假(0),则结束循环

  • 执行表达式3,(i++)等对于循环变量进行操作的语句

  • 执行for循环中执行代码块后执行第二步;第一步初始化只会执行一次

  • 循环结束,程序继续向下执行

注意:for循环中的两个分号一定要写

在for循环中:

  • 表达式1是一个或多个赋值语句,它用来控制变量的初始值

  • 表达式2是一个关系表达式,它决定什么时候退出循环

  • 表达式3是循环变量的步进值,定义控制循环变量每循环一次后按什么方式变化

  • 这三部分之间用分号分开

结束语句之break语句

需要中断循环,在C语言中可以使用break语句进行该操作,使用break语句时注意以下几点:

  • 在没有循环结构的情况下,break不能用在单独的if-else语句中。

  • 在多层循环中,一个break语句只跳出当前循环。

结束语句之continue语句

continue语句的作用是结束本次循环开始执行下一次循环。

break语句与continue语句的区别是:

break是跳出当前整个循环,continue是结束本次循环开始下一次循环。

分支结构之switch语句

switch语句结构如下:

f3c2634a-efae-11ec-ba43-dac502259ad0.png

switch语句时还应注意以下几点:

  • 在case后的各常量表达式的值不能相同,否则会出现错误

  • 在case子句后如果没有break;会一直往后执行**一直到遇到break;**才会跳出switch语句

  • switch后面的表达式语句只能是整型或者字符类型

  • 在case后,允许有多个语句,**可以不用{}**括起来

  • 各case和default子句的先后顺序可以变动,而不会影响程序执行结果

  • default子句可以省略不用

自定义函数

自定义函数的一般形式:

f3c9a54c-efae-11ec-ba43-dac502259ad0.png

注意:

  • []中包含的内容可以省略,数据类型说明省略时默认是int类型函数

  • 参数省略时表示该函数是无参函数,参数不省略表示该函数是有参函数

函数调用

需要用到自定义函数的时候,就得调用它,在C语言中,函数调用的一般形式为:

函数名([参数]);

注意:对无参函数调用的时候可以将[]包含的省略。

有参与无参

在函数中不需要函数参数的称之为无参函数,在函数中需要函数参数的称之为有参函数。

有参和无参函数的一般形式如下:

f3d31a78-efae-11ec-ba43-dac502259ad0.png

有参函数和无参函数的唯一区别在于:函数 () 中多了一个参数列表。

形参与实参

函数的参数分为形参和实参两种。

形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

实参是在调用时传递该函数的参数。

函数的形参和实参具有以下特点:

  • 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效

  • 实参可以是常量、变量、表达式、函数等

  • 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误

f3e19b66-efae-11ec-ba43-dac502259ad0.png

函数的返回值

函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。

函数的返回值要注意以下几点:

  • 函数的值只能通过return语句返回主调函数

return语句的一般形式为:

return 表达式

或者为:

return (表达式);
  • 函数值的类型和函数定义中函数的类型应保持一致

如果两者不一致,则以函数返回类型为准,自动进行类型转换。

  • 没有返回值的函数,返回类型为void

递归函数

递归就是一个函数在它的函数体内调用它自身,递归函数必须有结束条件。

执行递归函数将反复调用其自身,每调用一次就进入新的一层。

一句话总结递归:自我调用且有完成状态。

例题:

有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?

程序分析:

利用递归的方法,递归分为回推和递推两个阶段。要想知道第5个人岁数,需知道第4人的岁数,依次类推,推到第1人(10岁),再往回推。

#include  int dfs(int n) {return n == 1 ? 10 : dfs(n - 1) + 2;}int main(){printf("第5个人的年龄是%d岁", dfs(5)); return 0;}

局部与全局

C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

  • 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内

  • 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序

变量存储类别

C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。

静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。

动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。

C语言中存储类别又分为四类:

  • 自动(auto)

  • 静态(static

  • 寄存器的(register)

  • 外部的(extern)

用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。如:

f3f34b54-efae-11ec-ba43-dac502259ad0.png

用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。如下为静态局部变量:

f4026ab2-efae-11ec-ba43-dac502259ad0.png

注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。

为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。例如:

f4119f50-efae-11ec-ba43-dac502259ad0.png

注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。

用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。如:

f421e504-efae-11ec-ba43-dac502259ad0.png

内部函数与外部函数

在C语言中不能被其他源文件调用的函数称谓内部函数 ,内部函数由static关键字来定义,因此又被称谓静态函数,形式为:

static [数据类型] 函数名([参数])

这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。

在C语言中能被其他源文件调用的函数称谓外部函数 ,外部函数由extern关键字来定义,形式为:

extern [数据类型] 函数名([参数])

C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。

数组

程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组。可以将数组理解为大小固定,所放物品为同类的一个购物袋,在该购物袋中的物品是按一定顺序放置的。

我们来看一下如何声明一个数组:

数据类型 数组名称[长度];

数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:

数据类型 数组名称[长度n] = {元素1,元素2…元素n};数据类型 数组名称[] = {元素1,元素2…元素n};数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;

我们将数据放到数组中之后又如何获取数组中的元素呢?

获取数组元素时:

数组名称[元素所对应下标];

如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。

注意:

  • 数组的下标均以0开始

  • 数组在初始化的时候,数组内元素的个数不能大于声明的数组长度

  • mtianyan: 如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0

  • 在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定

数组的遍历

数组就可以采用循环的方式将每个元素遍历出来,而不用人为的每次获取指定某个位置上的元素,例如我们用for循环遍历一个数组:

f4345e6e-efae-11ec-ba43-dac502259ad0.png

注意以下几点:

  • 最好避免出现数组越界访问,循环变量最好不要超出数组的长度

  • C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法

由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度。

C语言获取数组长度:

int length = sizeof(arr)/sizeof(arr[0]);

数组作为函数参数

数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数。

整个数组当作函数参数,即把数组名称传入函数中,例如:

f44369ae-efae-11ec-ba43-dac502259ad0.png

数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:

f453ef5e-efae-11ec-ba43-dac502259ad0.png

数组作为函数参数时注意以下事项:

  • 数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度

  • 数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致

数组的应用-冒泡排序

以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。

#include int main(){double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80};int i,j;printf("
************排队前*************
");for(i=0;i<10;i++)    {if(i != 9)   printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位elseprintf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位    }for(i=8; i>=0; i--)    {for(j=0;j<=i;j++)        {if( arr[j]>arr[j+1])      //当前面的数比后面的数大时            {double temp;    //定义临时变量temp                temp=arr[j];//将前面的数赋值给temp                arr[j]=arr[j+1];             //前后之数颠倒位置                arr[j+1]=temp;//将较大的数放在后面                }                         }                    }printf("
************排队后*************
");for(i=0;i<10;i++)    {if(i != 9)   printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位     elseprintf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位    }return 0;    }

数组的应用-数组查找功能

当我们购物之后,拎着购物袋回到家,会一一检查购物袋中的物品看是否缺少或者都是想购之物。那么应用到程序中,可以使用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。

#include int getIndex(int arr[5],int value){int i;int index;for(i=0;i<5;i++)    {/* 请完善数组查询功能 */if(arr[i]==value)        {index=i;break;        }  index=-1;    }return index;}int main(){int arr[5]={3,12,9,8,6};int value = 8;int index = getIndex(arr,value);      //这里应该传什么参数呢?if(index!=-1)    {printf("%d在数组中存在,下标为:%d
",value,index);                 }else    {printf("%d在数组中不存在。
",value);        }return 0;    }

字符串与数组

C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:

char 字符串名称[长度] = “字符串值”;     //[]中的长度是可以省略不写的char 字符串名称[长度] = {‘字符1’,‘字符2’,…,‘字符n’,’’}; //最后一个元素必须是’’,’’表示字符串的结束标志

注意:在输出字符串的时候可使用如下语句。

printf(“%s”,字符数组名字);puts(字符数组名字);

字符串函数

常用的字符串函数如下(strlen,strcmp,strcpy,strcat,atoi):

f464c86a-efae-11ec-ba43-dac502259ad0.png

使用字符串函数注意以下事项:

strlen()获取字符串的长度,在字符串长度中是不包括‘’而且汉字和字母的长度是不一样的。比如:

f47244cc-efae-11ec-ba43-dac502259ad0.png

strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,例如:

f47d4958-efae-11ec-ba43-dac502259ad0.png

strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝,比如:

f489794e-efae-11ec-ba43-dac502259ad0.png

strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

f49bb622-efae-11ec-ba43-dac502259ad0.png

多维数组

多维数组的定义格式是:

数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n];

f4acfea0-efae-11ec-ba43-dac502259ad0.png

定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。

f4ba2396-efae-11ec-ba43-dac502259ad0.png

多维数组的初始化与一维数组的初始化类似也是分两种:

数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}};数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n]; 数组名称[下标1][下标2]…[下标n] = 值;

多维数组初始化要注意以下事项:

  • 采用第一种始化时数组声明必须指定列的维数。mtianyan: 因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数

  • 采用第二种初始化时数组声明必须同时指定行和列的维数

二维数组定义的时候,可以不指定行的数量,但是必须指定列的数量。

多维数组的遍历

多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环。

注意:多维数组的每一维下标均不能越界

实例代码:

#include #define N 10//打印分数 void printScore(int score[]){int i;printf("
");for(i=0;i  {printf("%d ",score[i]);                 }printf("
");     }//计算考试总分 int getTotalScore(int score[]){int sum = 0;int i;for(i=0;i  {    sum+=score[i];                  } return sum;}//计算平均分 int getAvgScore(int score[]){return getTotalScore(score)/N;   }//计算最高分 int getMax(int score[]){int max = -1;int i;for(i=0;i  {if(score[i]>max)    {      max = score[i];                  }                  } return max;}//计算最低分 int getMin(int score[]){int min =100;int i;for(i=0;i  {if(score[i]< min)    {      min = score[i];                  }                  } return min;}//分数降序排序 void sort(int score[]){int i,j;for(i=N-2;i>=0;i--)  {for(j=0;j<=i;j++)    {if(score[j]1])      {int temp;        temp = score[j];        score[j] = score[j+1];         score[j+1]=temp;                        }                     }                     }  printScore(score);     }int main(){int score[N]={67,98,75,63,82,79,81,91,66,84};int sum,avg,max,min;  sum = getTotalScore(score);  avg = getAvgScore(score);  max = getMax(score);  min = getMin(score);printf("总分是:%d
",sum);printf("平均分是:%d
",avg);printf("最高分是:%d
",max);printf("最低分是:%d
",min);printf("----------成绩排名---------
");  sort(score);return 0;    }

原文标题:C语言基础知识点汇总

文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135770
  • 函数
    +关注

    关注

    3

    文章

    4276

    浏览量

    62303
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13590

原文标题:C语言基础知识点汇总

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中的基本数据类型

    C语言是非常重要的一门程序设计语言,学好C语言再去学习其他编程语言将变得很轻松,因为大部分
    发表于 04-26 17:33 1946次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的基<b class='flag-5'>本数据类型</b>

    C语言中基本数据类型、变量和常量的使用

    C语言中基本数据类型、变量和常量的使用
    发表于 08-18 16:42 2408次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中基<b class='flag-5'>本数据类型</b>、变量和常量的使用

    技术干货驿站 ▏深入理解C语言:基本数据类型和变量

    C语言中,数据类型和变量是编程的基础,也是理解更复杂概念的关键。数据类型决定了变量的内存分配、存储范围和操作方式,而变量则是存储数据的容器
    的头像 发表于 07-26 17:53 1836次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:基<b class='flag-5'>本数据类型</b>和变量

    C语言本数据类型,变量和常量

    ),float(单精度浮点型),double(双精度浮点型),signed(有符号) ,unsigned(无符号),long(长整型)数据数据类型的单词在C语言中称为关键字非基
    发表于 01-16 11:33

    C语言的基本数据类型包括哪几种

    C语言的基本数据类型包括哪几种?分别是什么?
    发表于 10-14 12:27

    C预处理与C语言本数据类型

    指令表:注意:宏名的书写由标识符与两边各两条下划线构成。C语言本数据类型不同操作系统中数据类型所占字节数图解数据类型的其他分类:变量常量(
    发表于 12-21 08:29

    Java的基本数据类型与条件结构

    《Java基础入门》第二篇1 基本数据类型,运算符与表达式,条件结构,循环结构...
    发表于 12-23 08:02

    单片机C语言中常用的基本数据类型分为哪几类

    不管在什么语言中,定义一个变量时必然要在内存中开辟一个相应大小的空间来存储该变量。不同的数据类型在内存所占的空间大小不同,其所能表示的数据范围也不相同。在单片机C
    发表于 02-28 06:46

    C语言教程之C语言本数据类型与顺序程序设计讲解

    本文档的主要内容详细介绍的是C语言教程之C语言本数据类型与顺序程序设计讲解。在程序运行时,其值不能被改变的量称为常量。常量可分为三种:整型
    发表于 10-26 16:48 3次下载

    C语言程序设计教程之基本数据类型和运算符及表达式的资料说明

    本文档详细介绍的是C语言程序设计教程之基本数据类型和运算符及表达式的资料说明主要内容包括了:1 C数据类型,2 常量与变量,3
    发表于 01-25 15:44 0次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>程序设计教程之基<b class='flag-5'>本数据类型</b>和运算符及表达式的资料说明

    C语言数据储存与数据类型类型转换的详细资料说明

    程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据C语言根据需要,抽象出了一些基
    的头像 发表于 02-24 15:39 3917次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>数据</b>储存与<b class='flag-5'>数据类型</b>及<b class='flag-5'>类型</b>转换的详细资料说明

    51单片机学习笔记(9)——C51的基本数据类型和扩充数据类型

    本数据类型:扩充数据类型
    发表于 11-14 13:36 1次下载
    51单片机学习笔记(9)——<b class='flag-5'>C</b>51的基<b class='flag-5'>本数据类型</b>和扩充<b class='flag-5'>数据类型</b>

    Struct结构数据类型

    Struct类型是一种由多个不同数据类型元素组成的数据结构,其元素可以是基本数据类型,也可以是Struct、数组等复杂数据类型以及PLC
    的头像 发表于 07-25 17:02 2906次阅读

    C语言-基本数据类型与位运算

    这篇文章作为基础知识点,总结C语言的基本数据类型有哪些,浮点数的精度,整数变量的空间范围,变量定义语法,变量命名规则,浮点数打印格式,基本数据类型printf对应的打印、位运算的知识点
    的头像 发表于 08-14 09:56 1516次阅读

    本数据类型分享

    本数据类型本数据类型:包括位、位序列、整数、浮点数、日期时间。此外字符也属于基本数据类型,请参见文档String与WString。 1.位和位序列 2.整数数据类型 3.浮点型实
    的头像 发表于 06-13 14:14 9081次阅读
    基<b class='flag-5'>本数据类型</b>分享