1、指针函数和函数指针
函数指针:指向一个函数的指针
指针函数:一个函数的返回值是一个指针的函数
2、指针的大小
char* int* float*
指针的大小和编译器的位数有关,在32bit(x86)的系统下指针的大小是4个字节,在64bit(x64)的系统下指针是8个字节
指针的大小是固定的和指针的类型没有关系
3、sizeof和strlen的区别
sizeof:运算符,关键字。计算数据类型/变量所占存储空间的大小(字节数)。
strlen:函数。计算字符串长度。
(1)sizeof是一个运算符,strlen是一个函数,包含string.h
(2)sizeof计算的是所占内存的大小(/0需要计算),strlen计算的是字符串的长度(字符串以/0结尾,/0是不需要计算长度的)
(3)strlen一般用于字符串的长度,sizeof可以计算int float类型的大小
(4)计算时间:sizeof在编译期,strlen在运行期
4、c语言内存分配的方式
(1)静态存储器分配,例如全局变量,静态变量
(2)栈上分配(函数中定义出的局部变量)
(3)堆上分配(malloc,new)
5、数组指针和指针数组
(1)数组指针:指的是指向数组的指针,本质是一个指针
int (*p)[10];//数组指针的声明
(2)指针数组:本质是一个数组,里面的每一个元素都是指针
int* a,a1,a2;
int* p1[10]={a,a1,a2};//指针数值
6、struct结构体和union联合体区别
union 联合体:所有成员共享一块地址。
大小计算:共用体大小 = 成员中占内存最大的成员的大小。
struct 结构体:不同的成员放在不同的地址中。
大小计算:结构体大小 = 所有成员大小之和(字节对齐)。
7、野指针
野指针:指向不可用内存的指针
为什么会导致野指针:
(1)当指针被创建的时候,没有赋值这个时候指针就成为了野指针
char* p;
(2)当指针被free或delete后,如果没有把指针赋值为NULL,这个时候指针也是野指针
#include <malloc.h>
char* p1 = malloc(10);
free(pl);
(3)当指针越界的时候也是野指针(经常出现在数组里面)
8、数组和链表的区别
(1)数组的地址空间是连续的,链表的地址空间是不连续的
(2)数组的访问速度比较快,数组直接通过下标访问,访问链表的时候需要遍历链表
(3)链表增删查改的速度比数组快
9、宏函数注意点
写一个宏,这个宏返回输入参数比较小的一个
#define MIN(a,b) ((a)<=(b) ? (a):(b))//每个参数都要加一个括号
10、#include<>和#include""的区别
(1)#include<>:编译器会从标准库的路径里面去搜索,对于搜索标准库的文件速度会比较快
(2)#include"":编译器会从用户的工作路径里面去搜索,对于自己定义的文件使用“”的速度会比较快
11、全局变量和局部变量的区别
(1)作用域:全局变量的作用域为程序块,局部变量的作用域是当前函数内部
(2)生命周期:全局变量的生命周期是整个程序,局部变量的生命周期是当前的函数
(3)存储方式:局部变量存储在栈里面的,全局变量存储在全局数据区中
(4)使用方式:全局变量在程序的各个部分都可以使用到,局部变量只能在函数的内部区使用
12、#define和typedef的区别
(1)define是一个预处理指令,typedef是关键字
(2)define不会做正确性检查,直接进行替换,typedef会做正确性检查
(3)define没有作用域的限制,typedef是有作用域的限制
(4)对指针的操作不同,一般使用typedef对指针进行重命名
13、static的作用
用来定义一个静态变量或者是静态函数
(1)在函数体中使用static去定义变量,那么这个变量只会被初始化一次
void fun(void)
{
static int a=0;//只会被执行一次
a++;
}
(2)定义的静态函数或者是静态变量只能在当前文件中使用(作用域的限制)
(3)在函数内部定义的静态变量无法被其他函数使用
14、内存泄漏
内存泄漏指的是在程序运行的时候,动态分配的空间没有被回收或者是正确释放,导致了这个内存空间仍然占据着系统的资源
15、内存对齐
内存对齐是在存储数据时,将数据按照一定的规则放置在内存中的过程
typedef struct
{
char a;//1
short c;//2
int d;//4
double b;//8
}STU;
以最大的变量所占据的内存来进行分配内存空间
16、数组名和指针的区别
(1)数组名就是数组首元素的地址,也可以看作一个常量指针,这个指针是不能修改指向的,内存访问为4个字节
(2)使用指针访问数组的时候需要使用到解引用使用*,使用指针访问数组是间接访问,使用数组名访问数组是直接访问
(3)使用sizeof对指针和数组名进行计算的时候也是不同的,指针的大小和编译器的位数有关,使用sizeof计算数组名是整个数组的大小
17、指针常量和常量指针
常量指针:指向一个常量的指针,这个指针无法修改所指向的数据,但是可以修改指向
int a =5;
int b =6;
const int *p = &a;
p=&b;
指针常量:指针是一个常量,指针所指向的地址是固定的,但是可以修改地址中的值
int* const pl = &a;
*pl = 5;
18、堆和栈的区别
(1)创建方式不同:
栈是系统自动创建(栈主要用于保存局部变量),当函数执行完成,栈被销毁
堆是程序员手动进行创建和释放的,malloc进行创建,free进行释放
(2)空间大小的区别:
栈的空间是比较小的
堆的空间是比较大的
(3)访问速度:
栈的访问速度是比堆要快的
(4)生命周期
栈当使用完成后就会自动被销毁
堆是要靠程序员自己进行手动销毁
19、malloc和new的区别
(1)malloc是C语言中的标准库函数,new是C++中的操作符
(2)malloc分配内存后返回的是void*类型的指针,new分配内存后返回的是对应对象类型的指针
(3)使用malloc分配内存的时候需要进行指定内存的大小,使用new进行内存分配时不需要指定
(4)使用malloc分配内存的时候不会调用到构造函数,使用new分配内存时会调用到构造函数
20、struct和class在C++中的区别
(1)struct成员默认是共有的,class默认的成员是私有的
(2)继承方面:struct默认的是共有继承,class默认的是私有继承
(3)使用场景:struct一般是用于做简单的数据结构(在c语言中一般是类型重命名),class一般用于封装和继承
21、C++中的类有几个访问权限
在C++中分别有三个访问权限:共有的、私有的、受保护的
&#x