C语言知识点(指针篇)
指针
1、哪些情况会出现野指针
指针变量未初始化、指针释放后未为置空、指针操作超越变量作用域
2、描述内存分区
程序在运行前:分为代码区、BSS段(未初始化数据区)、data段(初始化数据区)
程序在运行后:堆区、栈区、全局区(静态区)、文字常量区、代码区
3、描述普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
普通局部变量:
存在栈区、不初始化内容随机、只在定义所在的复合语句中有效、符合语句结束变量空间释放
普通全局变量
存在全局区、不初始化内容为0、进程结束空间才被释放,能被当前源文件或其他源文件使用,只是其他源文件使用的时候,记得使用extern修饰
静态局部变量:
存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能在定义所在的复合语句中有效
静态全局变量
存在全局区、不初始化内容为0、整个进程结束空间才被释放,只能被当前源文件使用
4、描述指针数组的概念
指针数组本质是数组,只是数组的每个元素是一个指针(地址)
5、描述32位或64位平台下指针的大小
32位平台:任意类型的指针大小为4字节
64位平台:任意类型的指针大小为8字节
6、描述指针与指针变量的区别
指针:内存中每一个字节都会分配一个32位或64位的编号,这个编号就是地址, 而指针就是内存单元的编号。
指针变量:本质是变量 只是该变量存放的是空间的地址编号
7、指针和地址的区别
指针和地址最大的区别是指针有类型,而地址没有类型,地址仅仅是地址编号。指针是由地址和类型组成,指针不仅记录了地址编号还记录了该地址空间的类型
8、描述一下int *p含义
p为指针变量,p自身类型为int *,指向的类型为int *,p可以保存的是int变量的地址编号
9、描述int *p[5]的含义
p是指针数组的数组名,该数组5个元素,每个元素为int *类型。p是存放整形变量地址的数组。
10、描述int (*p)[10]的含义
p是数组指针变量,p的本质是指针变量 保存的是数组的首地址,该数组必须有10个元素且每个元素的类型为int类型
11、描述int *p[10]的含义
p是指针数组,p的本质是数组 只是数组的每个元素为int *类型
12、描述int (*p)(int,int)的含义
p是函数指针变量, p的本质是指针变量 ,它保存的是函数的入口地址,只是该函数必须是int类型的返回值类型,且有两个int类型的形参。
13、描述int (*p[5])(int ,int)的含义
p是函数指针数组。p的本质是数组,数组的每个元素为函数指针,该函数必须是int返回值类型和两个整型的形参
14、描述数组元素指针变量的含义
数组元素指针变量是指保存数组元素的地址的指针变量,该变量+1跳过一个元素
15、两个指向同一数组的元素指针变量的关系
指向同一数组的元素指针变量可以判断大小、赋值但是相加是无意义的。
< >判断两指针变量的位置关系
==判断两指针变量是否指向同一处
=让两指针变量 指向同一处
-计算两指针变量间相差的元素的个数
+两指针变量相加是无意义
16、指针作为函数的参数的意义
指针作为函数的参数,函数内部可以修改外部指针所对应空间的内容
指针作为函数的参数,如果传递的是自定义类型数据的地址,可以节约空间
指针作为函数的参数,可以将外部申请的空间传递到函数内部使用
17、指针作为函数的返回值类型的意义
指针作为函数的返回值类型 可以将函数内部的空间返回到函数外部使用
18、描述函数指针变量
函数指针变量本质是指针变量,只是该变量保存的是函数的入口地址,我们可以通过函数指针变量简介的调用该指针变量所保存的函数
19、函数指针变量作为函数参数的意义
如果函数指针变量作为函数的参数,那么该函数可以同函数指针参数间接调用外部传递过来的函数。这样可以让函数的功能多样化,实现函数的功能复用
20、Int *和int **的关系
Int *它的类型是int *类型 所指向的的类型为int类型
Int **它的类型是int **类型 所指向的类型为int *类型
Int *定义的变量的地址可以用int **定义的变量来保存
21、指针中用到的*和&各自的作用
在定义指针变量时,如:int *p;其中*的作用是修饰p为int *类型的指针变量
在使用的时候,如*p;表示取p所保存的地址编号对应空间的内容
在使用的时候,如#表示取变量num的地址变量,如果num的类型为int,那么&num的类型就为int *
在使用的时候,*和&如果同时出现,从左往右可以将*和&相互抵消
22、谈谈指针变量的类型
指针变量的类型分为:自身类型和指向类型
自身类型描述的是指针变量本身的类型,而指向的类型描述的是指针变量能够保存啥类型变量的地址
自身类型一般用判断指针变量赋值、传参时的指针类型是否匹配
指向类型一般用于决定指针变量能够访问所指向空间的长度,以及指针变量+1跳过的指针宽度
比如:int *p;p自身的类型为int *类型,而p指向的类型为int类型。*p能取空间的指针数为4字节,p+1跳过4字节
23、指针变量最好初始化为啥值
初始化为NULL
24、操作指针变量前,做好对指针变量做怎样的判断
操作指针变量前,最好判断是否指向了NULL
25、指针作为函数的返回值时需要注意啥
指针作为函数的返回值,不要返回函数内部中局部变量的地址。因为函数中局部变量在函数结束后会被立即释放,而外部通过函数返回值得到的地址也指向了以及回收的空间地址(非法地址),如果继续操作改地址将会出现段错误或其他不可确定的错误
26、谈谈const int *p和int *const p的区别
Const int *p:const修饰的是*,p是可读可写,但是用户不能通过*p修改外部空间的内容(只能读操作)
Int * const p;const修饰的是p,p一旦初始化了指向,就不能修改p的指向,但是用户可以使用*p修改外部空间的值
27、数组指针的定义形式
数组指针的定义形式为:类型 (*p)[]
28、数组指针的作用
数组指针可以保存数组的首地址,数组指针+1将跳过整个数组
一维数组指针可以和二维数组配合使用,可以使用一维数组指针保存二维数组的行地址,等同二维数组名一样的操作二维数组的元素