C语言最基础,最全涵盖小知识,速入

一、首先我们先来介绍什么是c语言

C语言是一门面向过程的,抽象化的通用程序设计语言,广泛应用于底层开发。

二、那么我们来介绍什么是c程序

C语言程序结构有三种:即顺序结构、循环结构、选择结构。其中循环结构有三个循环结构(do,for,while循环),选择结构有两个(if和switch)。

三、什么是main函数

每个C语言中main函数有且只有一个。读程序都要从main入手,然后从最上面顺序往下读(有循环做循环,有选择做选择)。

四、接下来是c语言的存储形式

计算机中的数据在电脑中以二进制形式保存 ,最低单位的存储单元是bit(位),位是由0或者1构成。Byte是字节,一个字节是8个位。数据存放的位置就是他的地址。

五、C语言的书写格式:

切记!每条语句后面必须有一个分号,分号是语句的一部分。一行可以写多个语句,一条语句也可以写在多行上

什么是整型数据

整型一般是两个字节,字符型是一个字节,双精度一般是四个字节;在考试时会说,在16位编译系统或者是32位编译系统,碰到这种情况,不要去管。做题的时候,掌握整型是两个字节,字符型是一个字节,双精度是4个字节就OK 了。

六、C语言中怎么赋值

是表达式就一定有数值。

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,注意常量不可以赋值。

复合赋值运算符:注意:a*=m+2是a=a*(m+2)

自加,自减表达式:假设a=5,++a(表达式的值为6),a++(表达式的值为5)pps:小总结++a是先加后用,a++是先用后加!

J=a++等价于j=a;a=a+1

J=++a等价于a=a+1;j=a

写在最后:

C语言是仅少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。学好c语言,快乐每一天。下期再会!

c语言基础知识归纳

C语言过程性语言,

结构化c程序的设计原则:

1.自顶而下;

2.逐步细化;

3.模块化设计;

4.结构化编码。

针对嵌入式C在实现中,存在两种不同的环境:翻译环境(translation environment)和执行环境(execution envionment)。

翻译环境:源代码转换为可执行的机器之类。

执行环境:用于实际执行代码。

两种环境很多时候位于不同的机器上。如:交叉编译器(cross compiler)部署在服务器端,

它产生的可执行代码运行于不同的CPU上。

由源程序到可执行代码需要经过翻译。

翻译阶段将组成程序的每个源文件通过编译过程转换为目标代码(object code)。然后,各个目标文件由链接器(linker)绑定在一起,形成可执行程序。链接器同时也会引入C函数库及个人或他人编写的库函数。

编译过程由预处理(prepressing),编译(compilation),汇编(assembly),链接(linker)。

预处理阶段:预处理器在源代码上执行文本操作。如:将#define指令定义的符号用实际值代替,读取由#include指令包含的文件内容,删除注释,添加行号和文件名标识,便于编译器在编译时产生调试用的行号信息和编译错误及告警的行号。

gcc -E test.c -o test.i

编译阶段:源代码经过解析,判断它的语句意思。此部分产生绝大多数的错误和告警。

分为扫描,语法分析,语义分析,源代码优化(在命令行加入了要求优化选项),目标代码生成,目标代码优化,优化器(optimizer)对目标代码优化,使它效率更高。注意优化需要额外的时间。

gcc -S test.i -o test.s 或 gcc -S test.c -o test.s

汇编:由汇编器as完成,将汇编代码转换为机器可执行的指令。

as test.s -o test.o 或 gcc -c test.c -o test.o 或 gcc -g -o test.o test.c

链接:由连接器ld完成,将源代码生成目标文件,如*.ko ,*.so ,*.out等

ld *.o -o test.out

链接生成的目标文件,为最终可执行文件。

C++基础知识总结(超详细总结)

  1. C++在C语言基础上引入了面对对象的机制,同时也兼容C语言
  2. C++有三大特性(1)封装。(2)继承。(3)多态
  3. C++语言编写出的程序结构清晰、易于扩充,程序可读性好
  4. C++生成的代码质量高,效率高
  5. C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等;
  6. C++可复用性高,C++引入了模板的概念,标准模板库STL(Standard Template Library)。
  1. C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等。
  2. C++是面对对象的编程语言;C语言是面对过程的编程语言。
  3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
  4. C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用
  1. struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装
  2. struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的
  3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承
  4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数,

1. 区别:

( 1 )尖括号 <> 的头文件是系统文件 ,双引号 \”\” 的头文件是自定义文件

( 2 )编译器预处理阶段查找头文件的路径不一样。

2.查找路径:

( 1 )使用尖括号 <> 的头文件的查找路径:编译器设置的头文件路径 –> 系统变量。

( 2 )使用双引号 \”\” 的头文件的查找路径:当前头文件目录 –> 编译器设置的头文件路径 –> 系统变量。

区别:

( 1 ) C 的结构体内不允许有函数存在 , C++ 允许有内部成员函数,且允许该函数是虚函数

( 2 ) C 的结构体对内部成员变量的访问权限只能是 public ,而 C++ 允许 public,protected,private 三种

( 3 ) C 语言的结构体是 不可以继承的 , C++ 的结构体 可继承

( 4 ) C 中 使用结构体需要加上 struct 关键字 ,而 C++ 中可以省略 struct 关键字直接使用。

1. C++ 中的 struct 是对 C 中的 struct 进行了扩充,它们在声明时的区别如下:

  1. 关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”, extern \”C\”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern \”C\”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
  2. 编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名

C++ 和 C 语言类似,一个 C++ 程序从源码到执行文件,有四个过程, 预编译、编译、汇编、链接

预编译: 这个过程主要的处理操作如下:

  • 将所有的#define删除,并且展开所有的宏定义
  • 处理所有的条件预编译指令,如#if、#ifdef
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 过滤所有的注释
  • 添加行号和文件名标识。

编译: 这个过程主要的处理操作如下:

  • 词法分析:将源代码的字符序列分割成一系列的记号。
  • 语法分析:对记号进行语法分析,产生语法树。
  • 语义分析:判断表达式是否有意义。
  • 代码优化。
  • 目标代码生成:生成汇编代码。
  • 目标代码优化。

汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。

链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

链接分为静态链接和动态链接

静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

  1. 定义全局静态变量和局部静态变量:初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。
  2. 定义静态函数:静态函数只能在本源文件中使用;如 static void func();
  3. 定义静态变量。静态变量只能在本源文件中使用;
  4. 定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间。
  5. 定义类中的静态成员函数:如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。

此外:

当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的 this 指针。而 静态成员函数不属于任何一个对象,因此 C++ 规定静态成员函数没有 this 指针 。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。

1. 概念:

(1)数组:数组是用于储存多个相同类型数据的集合 数组名是首元素的地址

(2)指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首 地址。

2. 区别:

(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝

(2)存储方式:

数组:数组在内存中是连续存放的,数组的存储空间,不是在静态区就是在栈上。

指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。 由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

(3)求sizeof:

数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)

在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类 型是什么,sizeof(指针名)都是8。

1. 概念: 函数指针就是 指向函数 的指针变量。每一个函数都有一个入口地址,该入口地址就是 函数指针所指向的地址。

2. 定义形式如下:

1. 函数指针的 应用场景回调 ( callback )。我们调用别人提供的 API 函数 (Application

Programming Interface, 应用程序编程接口 ) ,称为 Call ;如果别人的库里面调用我们的函数,就叫

Callback 。

对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。

而C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造

能。

原因:因为在编译时对象就绑定了函数地址,和指针空不空没关系。

  1. 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
  2. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。
  3. 避免办法:

(1)初始化置NULL

(2)申请内存后判空

(3)指针释放后置NULL

(4)使用智能指针

1. 首先从作用域考虑:C++里作用域可分为6种:全局,局部,类,语句,命名空间和文件作用域。

全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。

静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。

局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束。

2. 从所在空间考虑:除了局部变量在栈上外,其他都在静态存储区。因为静态变量都在静态存储区,所以下次调用函数的时候还是能取到原来的值。

3. 生命周期: 局部变量在栈上,出了作用域就回收内存;而全局变量、静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。

区别:

  1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率;而内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。
  2. 宏函数是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换 ;而内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率
  3. 宏定义没有类型检查的,无论对还是错都是直接替换;而内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等。

内联函数使用的条件:

  • 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率 的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:
  • (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
  • (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
  • 内联不是什么时候都能展开的,一个好的编译器将会根据函数的定义体,自动地取消不符合要求的内联。
  1. new是操作符,而malloc是函数。
  2. new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数;而malloc没有构造函数和析构函数。
  3. malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转。
  4. new可以被重载;malloc不行
  5. new分配内存更直接和安全。
  6. new发生错误抛出异常,malloc返回null

malloc底层实现:当开辟的空间小于 128K 时,调用 brk()函数;当开辟的空间大于 128K 时,调用mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。

new底层实现:关键字new在调用构造函数的时候实际上进行了如下的几个步骤:

1. 创建一个新的对象

2. 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)

3. 执行构造函数中的代码(为这个新对象添加属性)

4. 返回新对象

const 用于定义 常量 ;而 define 用于 定义宏 ,而宏也可以用于定义常量。都用于常量定义时,它们的区别有:

  1. const生效于编译的阶段;define生效于预处理阶段。
  2. const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的;define定义的常量,运行时是直接的操作数,并不会存放在内存中
  3. const定义的常量是带类型的;define定义的常量不带类型。因此define定义的常量不利于类型检查。

参考回答

1. 定义不同

指针函数本质是一个函数,其返回值为指针。

函数指针本质是一个指针,其指向一个函数。

2. 写法不同

3. 用法不同

用法参考答案解析

21 说说使用指针需要注意什么?

  1. 定义指针时,先初始化为NULL。
  2. 用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
  3. 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
  4. 避免数字或指针的下标越界,特别要当心发生“多1”或者“少1”操作
  5. 动态内存的申请与释放必须配对,防止内存泄漏
  6. 用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针”
  1. 内联函数比普通函数多了关键字inline
  2. 内联函数避免了函数调用的开销;普通函数有调用的开销
  3. 普通函数在被调用的时候,需要寻址(函数入口地址);内联函数不需要寻址。
  4. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句;普通函数没有这个要求。

内联函数的作用 :内联函数在调用时,是将调用表达式用内联函数体来替换。避免函数调用的开销。

参考回答

传参方式有这三种:值传递、引用传递、指针传递

  1. 值传递:形参即使在函数体内值发生变化,也不会影响实参的值;
  2. 引用传递:形参在函数体内值发生变化,会影响实参的值;
  3. 指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值;
  • 值传递用于对象时,整个对象会拷贝一个副本,这样效率低;而引用传递用于对象时,不发生拷贝行为,只是绑定对象,更高效;指针传递同理,但不如引用传递安全。

因篇幅有限,只给大家展示部分大纲目录内容!有需要的小伙伴,可以转发+关注后私信小编【学习】,即可免费领取

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。