[校招 –阶段一:高级程序语言C]语言基础

C语言的特点:
C语言是面向过程地语言,抽象地通用高级语言语言。C因为更接近原生,所以大量地底层代码用C写的。C语言也是一种普适性最强地计算机程序语言,它不仅由高级语言地特点,还具有机器语言地特点.C语言不仅其他把编程语言地特点,也具有自己独特地特点:

  1. 广泛性:C语言不仅具有广泛的预算范围,超过了其他的语言,其运算结果也是地表达也是十分丰富地。C语言包含了字符型,指针等多种数据结构。
  2. 简洁性:C语言具有9类控制语句和32个关键字,在计算机编程中具有了广泛的适用性,适合大都数地编程提高了编程地效率。
  3. 结构完善:C语言是以模块化的形式编程,这一特点点适应了多种的编程要求,执行效率高。

include头文件的顺序以及双引号"“和尖括号<>的区别:
对于include头文件来说如果在一个文件中声明.h另一个.h文件,编译先把.h文件中的.h文件展开接着展开引用的.h文件但是引用第一个.h的.c文件也要引用被包含的.h文件。负责会 报变量未引用的错误。
双引号”“和尖括号<>的区别就是编译器所对应的查找路径不同
对于双引号”"和尖括号<>编译器处理的方式不同;因为<>包含的是系统文件,而“” 包含的是自定义头文件。对于尖括号<> 编译器会更具头文件到系统文件中找对应的变量。二对于双引号到对应自定义头文件下的文下找相应变量。
宏定义:
C语言对应的宏定义是#define来定义宏变量,来实现编程的编写。
宏定义其实用一个变量来代替固定的数据类型
宏定义的形式为以下形式:

#define <宏名>(<参数表>) <宏体>
宏名对应就是标识符,参数列表可以是一个,也可以是多个。宏体就是被替换的数据内容。

在这里插入图片描述

C语言有大量的宏定义被应用,来代替函数,因为宏定义比函数运行时间更端。消耗的资源更小。函数的调用要开辟空间和小号栈空间,而且代码量也会大大增加,但是宏定义只在编译前进行,不分配空间,不占运行时间。
但是宏定义缺少参数的检查,如果宏定义的参数列表和返回值都要用()如果大意一点没加上运算结果可以和预期结果可能不符合。但是函数都解决了这个问题。
综上所述,如何取舍这二者,还需要根据具体情况具体分析,千万不能够武断地做出判断。一般来说,应该用宏去替换小的、可重复的代码段,这样可以使程序运行速度更快。当任务比较复杂,需要多行代码才能实现时,或者要求程序越小越好时,就应该使用函数。

const和define的区别:
const用于定义静态变量,而define用于定义宏定义而宏定义也可以用于定义常量.
const生效与编译阶段,define生效与编译前也就是预处理阶段。
const定义变量在内存中开辟空间,消耗栈资源。define定义变量运行时直接参与运算,不会再内存中开劈空间,更不会消耗栈资源。
comst定义的变量的带类型的;define定义变量的是没有类型在运算是不做类型检查。

static关键字的作用:

  1. 定义全局静态变量和局部静态变量:在变量前加上static关键字。初始化地变量会在数据段分配内存,未初始化的静态变量会在BBs分配内存。全据和局部只是作用域不同罢了。
    bss介绍
  2. 定义静态函数:在函数中加上static该函数只能在该源文件中使用
  3. 在数量类型前加上static,变量即被定义为静态变量,该静态变量只能在本源文件中使用。

static int a;静态变量
static void fun();//静态函数

  1. 在C++中static’用于定义静态成员变量,该静态变量被该类的所有对象所共享,所有对象都可以访问该静态变量的开辟的静态存储空间
  2. 在C++中static可以定义静态成员函数。该静态函数和静态变量类似单独开辟一块静态存储空间。该类所有的对象都可以访问该静态成员函数
  3. 在C++中当一个对象调用一个静态成员变量时,系统会把该对象的起始指针付给该成员函数的this指针,而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针。既然该静态成员函数没有指向没有任何一个对象,因此静态函数无法访问 对一个对象中的非静态成员访问。

指针和数组区别:

  • 数组:数组用于存储相同类型的数据结构。数组名就是首元素的地址,数组在内存空间是连续的。

  • 指针: 相当于一个变量,但是它有何变量不一样,它存放的是内存空间中的地址。
    赋值:相同的类型的指针变量可以相互复制,但是数组不能直接赋值,之间一个一个复制。

存储方式:指针存储的是内存空间的地址,而数组存储的是相同类型的集合
数组是在内存空间上开辟一段相连的将这些数据存储进去,开盘的空间不是在静态空间就是在栈空间中。
但是指针可以任何类型的元素,指针的类型说明了它所指向内存空间的地址。由于指针是一个变量,加上存储的是变量,所以存储的内存空间的地址就不能确定。
初始化:数组的初始化是用该类型的变量直接赋值,就可以,但是指针要初始化就要开辟一段内存空间。否则就会报空指针异常的错误。
指针操作:

int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组
p = a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
//所以数组指针也称指向一维数组的指针,亦称行指针。
//访问数组中第i行j列的一个元素,有几种操作方式:
//*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]。其中,优先级:()>[]>*。
//这几种操作方式都是合法的。

指针变量的数据操作:

char *str = "hello,douya!";
str[2] = 'a';
*(str+2) = 'b';
//这两种操作方式都是合法的

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

int fub()//这是一个函数
int (fub*)()//这是一个指针函数

指针函数的应用场景:
回调函数:

//以库函数qsort排序函数为例,它的原型如下:
void qsort(void *base,//void*类型,代表原始数组
size_t nmemb, //第二个是size_t类型,代表数据数量
size_t size, //第三个是size_t类型,代表单个数据占用空间大小
int(*compar)(const void *,const void *)//第四个参数是函数指针
);

第四个参数告诉qsort,应该使用哪个函数来比较元素,即只要我们告诉qsort比较大小的规则,它就可以帮我们对任意数据类型的数组进行排序。在库函数qsort调用我们自定义的比较函数,这就是回调的应用。

int comper(const void *a,const void*b){}

定义一个该指针变量指向函数

int c[100];
qsort(c,100,100,comper);//回调

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>