C语言基础知识梳理总结

简介: C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结

数据类型

常量:常量包括字面常量、直接常量和符号常量;

 变量:C语言规定标志符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或者下划线;必须压迫先定义后使用;每一个变量被定义以确定类型后,在编译时就能为其分配相应的存储单元;

 整数类型:整数常量有十进制、八进制和十六进制;“%d”

 整形变量:数据在内存中存放形式是以二进制形式存放;有int型、short int型和long int型,无符号整型变量的范围是-32768—32767,有符号型为0~65535.通常把long定义为32位,把short定义为16位,int可以是32位也可以为16位,这都主要取决于机器字长。

 实型常量的表示方法:

(1)十进制,0.0;

(2)指数形式,123e3

 实型变量:实数型数据在内存中的存放形式,一般在内存中占4个字节,分成整数部分和小数部分存放。实型变量分为float型、double型long double型。实型数据会存在舍入误差。

 实型常量的类型:C编译系统将实型常量作为双精度来处理。

 字符型数组:

(一)字符常量:转义字符(\n——换行,\t——tab,\r——回车,\f——换页,\b——退格,\ddd——1到3位8进制的数代表的字符)

(二)字符变量:字符数据存储形式实际是以ASCII码存储。“%c”

 字符串常量:双撇号括起来的一系列字符序列。


C的运算符有以下几种:

1、算术运算符(+ - * / %)结合方向自左向右

 2、关系运算符(> < == >= <= !=)

 3、逻辑运算符(! && ||)

 4、位运算符(<< >> ~ | ^ &)

 5、赋值运算符(=及符号扩展赋值运算符)

 6、条件运算符(? : )

 7、逗号运算符( , )

 8、指针运算符( &)

 9、求字节运算符(sizeof)

 10、强制类型转换运算符((类型))

 11、分量运算符( . ->)

 12、下标运算符([])

 13、其他*


控制语句:

完成一定的控制功能。

 1、if()else

 2、for()~

 3、while()~

 4、do~while()

 5、continue

 6、break

 7、switch

 8、goto

 9、return


字符数据的输入输出:

1、putchar()输入字符变量

2、getchar()只能接受一个字符


格式输入输出:

1、printf(%d—整型,%c—字符型,%ld,%md,%o,%u,%s,%-m.nf,%e,%g)

2、scanf(格式控制,地址列表)


数组

一维数组的定义:类型说明符 数组名【常量表达式】;先定义后引用;一维数组初始化时可以只对一部分元素初始化,在对全部数组元素初始化的时候可以部规定长度;但是若被定义的数组长度与提供的初始值不一样时,则数组长度不能省略。

 二维数组的定义:类型说明符 数组名【常量表达式】【常量表达式】C语言中存放二维数组是先存放第一行的元素,紧接着是第二行,其实也是以一维的方式存放。如果初始化时能指定所有元素的初始值,第一维大小可以省略,但是第二维不能省略。

 字符数组:定义和初始化跟数组差不多,只是需要加单引号。字符和字符串结束标志,C语言规定,以‘\0’代表。


字符串处理函数:

1、puts()将一个字符串输出到终端

2、gets()从终端输入一个字符串到字符数组,并且得到一个函数值。

3、strcat()链接两个字符数组中的字符串。

4、strcpy()字符串复制函数。

5、strcmp()比较字符串作用。

6、strlen()测试字符串长度的函数不包括“\0”

7、strlwr()将字符串中的大写字母转换为小写字母。

8、strupr()将字符串中的小写字母转换为大写字母。


函数

1、一个源程序由多个函数组成。

 2、C程序的执行从main()函数开始;

 3、所有函数都是平行的;

 4、函数分类;可以分为标准和自定义,还可以分为有参函数和无参函数。

函数定义的一般形式:

1、类型标志符 函数名()

{

  声明部分

  语句

 }

2、类型标志符 函数名(形式参数列表)

 {

声明部分

  语句

 }

关于形参和实参的说明:

 (1) 在定义函数中指定的形参,在未出现函数调用时,他们并不占用内存中的存储单元,只有发生调用时,才会分配内存。

 (2) 实参可以是常量、变量或者表达式;有时传递的时地址;

 (3) 在被定义中,形参必须指定类型;

 (4) 实参与形参的类型应相同或赋值兼容;

 (5) C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只有实参传递给形参,而不能由形参传递给实参。

函数的返回值:

 希望通过函数调用使主调函数得到一个确定的值。

1、函数的返回值是通过函数中的return语句获取的。

2、函数值的类型;

3、如果函数值的类型和return语句中表达式的值不一样,则以函数类型为准。

4、如果调用函数中没有return语句,并不带回一个确定的用户需要的值,函数不是不带回值,而只是不带回有用的值,带回一个不确定的值。

5、如不需要带回任何值,用void。

函数的调用:

 调用方式:1、函数语句;2、函数表达式;3、函数参数。

被调用的函数的声明:

 一个函数调用另一个函数所具备的条件:

 1、首先被调用的函数必须是已经存在的函数;

 2、如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。

 3、如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。

 4、如果被调用的函数定义出现在主调函数之前可以不必声明。

 5、如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明。

局部变量和全局变量:

1、局部变量在一个函数内部定义的变量是内部变量,它只是在本函数范围内的有效,主函数也不能使用其它函数中定义的变量;不同函数中可以使用相同的名字的变量,他们代表不同的对象,互不干扰;形式参数也是局部变量;在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合句也可以称为“分程序”或“程序块”;

2、全局变量,在函数之外定义的变量称为外部变量,全局变量可以增加函数间数据联系的渠道,一般不再必要时不要使用,他在程序的全部执行过程中占用存储单元,是函数的通用性,使用全局变量会使程序的清晰性降低。还要注意若果同一源文件中,外部变量和局部变量同名,则在局部变量作用范围内,外部变量被“屏蔽”,不起任何作用。


变量的存储类别:

(变量值存储时间)动态存储方式,在程序运行期间进行分动态的分配存储空间的方式,静态存储方式是指在程序运行期间分配固定的存储空间的方式;存储空间分为程序区、静态存储区和动态存储区;全局变量全部放在静态存储区中,程序开始时分配空间,完毕时释放;动态存储区中存放以下数据:

1、函数形式参数;

2、自动变量;

3、函数调用时的现场保护和返回地址;

在C语言中每个变量和函数都有两个属性,是数据类型和数据存储类型,存储类别是数据在内存中存储的方式。

 存储方式分为静态和动态存储类,具体包含有四种:

自动的(auto);

静态的(static);

寄存器的(register);

外部的(extern),

如果不加以声明,就自认为是auto型就会自动分配存储空间属于动态存储方式。

static声明局部变量是在函数调用结束后不消失而保留原值,即占用存储单元不释放,在下一次调用该函数时,该变量已有值,就是上次函数调用结束时的值。其中需要说明的是在定义局部变量不赋初值的话,则静态局部变量编译时自动赋值为0或者空字符,虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能引用它的。静态局部变量主要用在当初始化后,变量只是被引用而不改变其值。

register变量是C语言中允许将局部变量的值放在CPU中的寄存器中需要时直接从寄存器中取出来参加运算,不必再到内存中提取,但是计算机系统中寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量。

extern声明外部变量,用以扩展外部变量的作用域。在一个文件中,如果定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做外部变量声明。在多文件中,也可以采用extern声明的办法进行外部变量声明。

有时希望某些局部变量只限于被本文件引用,而不能被其他文件引用,这时就可以采用在定义外部变量时外加一个static,这在程序模块化设计中加强了通用性。static来声明一个变量的作用有二个,一个是在声明对局部变量时。则为该变量分配的空间在整个程序执行期间始终存在;一个是在对全局变量声明中,该变量的作用域仅限于本文件模块操作。注意:这些方法同样适用于函数的声明。


指针:

**指针是指向一片内存空间的地址,指针变量是变量,是存放一片内存空间首地址的变量,我们一般所说的指针都是指针变量。

指针的定义及赋值:

 类型说明 *变量名  列如 int *p;

 区别 int *p=NULL 与 *p=NULL

int p=NULL; //定义指针变量p,并且同时将p的值设置为0x00000000,不是把p的值设置为0x0000000,这个过程叫做初始化

int *p;p=NULL; //定义指针变量p,将p的值设置为NILL,即给p所指向的内存赋值NULL,但是p所指的内存可能是非法的,编译可能会显示内存访问错误,那么做出如下修改,给它一块合法的内存。

int i=10;int *p=&i;*p=NULL; //这时i中的值由10变成了0,而p值本身没变,即内存地址没有改变

指针的大小:

int *P;sizeof§; //指针的大小根据计算机的位数确定,32位机大小为4个字节,64位机大小为8个字节。

指针运算:

 需要注意的是指针的类型,+1加的是一个指针类型的大小。

 int a[10];int *p=&a; //+1,加了sizeof(int)*1个字节,而不是加sizeof(int[10])*1个字节

指针的使用类型

 指针形式

 数组形式:

 int a[10];int P=a;

p[0]=1; //指针的数组形式

(p+1)=2; //指针的指针形式

通过指针修改内容的汇编过程

 1.找到指针变量的地址

 2.通过指针变量的地址,找到内容的地址

 3.通过地址找到内容

 4.修改内容


相关文章
|
机器学习/深度学习 监控 Python
tensorflow2.x多层感知机模型参数量和计算量的统计
tensorflow2.x多层感知机模型参数量和计算量的统计
384 0
|
5月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
205 0
|
7月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
292 12
|
缓存 中间件
Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志
这篇文章介绍了在Nest.js中如何实现记录用户CURD操作的需求。首先解释了什么是拦截器以及拦截器的作用,然后通过创建Prisma模型,添加Log模型,并通过编写LoggerInterceptor拦截器,实现了记录用户操作的功能。最后通过效果演示和总结,强调了使用拦截器实现此功能的有效性。
302 0
Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志
|
9月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
356 1
一文彻底搞清楚C语言的函数
|
9月前
|
Rust 安全 Java
当质疑声起,C++ 用实力碾碎所有否定,夺回本应属于它的地位
当质疑声起,C++ 用实力碾碎所有否定,夺回本应属于它的地位
|
弹性计算 网络安全 数据安全/隐私保护
三分钟在阿里云搭建自己的帕鲁服务器
《幻兽帕鲁》是Pocketpair投资10亿日元(约合人民币4842万元),耗费近4年时间开发的一款开放世界生存制作游戏,游戏于2023年11月2日至11月5日进行了封闭网络测试,于2024年1月18日发行抢先体验版本 。 游戏中,玩家可以在广阔的世界中收集神奇的生物“帕鲁”,派他们进行战斗、建造、做农活,工业生产等。 在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。 帕鲁可以进行战斗、繁殖、协助玩家做农活,也可以为玩家在工厂工作。 玩家也可以将它们进行售卖,或肢解后食用。
649 10
三分钟在阿里云搭建自己的帕鲁服务器
|
9月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
12月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
373 4
|
12月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
495 5