什么是指针?
总的来说,从基本概念上看,指针只是一种数据类型,它的值就是某个内存地址;但是指针真正的意义所在就是为程序员提供了管理内存的绝佳途径,因为与一般的数据类型不同,指针存放的是某个内存地址,这意味着程序员可以利用指针的值对内存进行直接的操作,可以说使用指针的过程就是在跟内存打交道,在管理内存,因此,学会使用指针,理解指针将会对认识和理解数据在内存中的组织以及程序的工作原理有非常大的帮助!当然凡事都有两面性,指针的灵活和自动相应也带来了安全性的问题,如果使用不当,会造成诸如产生未定义行为,更有甚者会导致程序崩溃或操作系统崩溃。
下面总结自己对指针、内存管理相关的知识点
内存分类
首先是内存的分类,C程序在编译后所使用的内存,可以分为3类
第一,静态、全局内存
分配在这类内存的对象,在程序的整个运行期间都存在,也就是这类对象的生命周期与程序相同,但作用域有所不同,分配在静态内存的对象称为静态对象或静态变量,这类对象的作用域是声明它的语句块;全局对象的作用域是整个文件。
第二,自动/局部内存
这类内存的空间分配给自动变量,自动变量就是在函数内声明的变量,这类变量的作用域是函数内,其实,C语言是根据语句块来确定变量的作用域的,如果将整个C源文件看作是一个大的语句块,那么作用域就是文件中的某个语句块。而自动变量的作用域就是函数内声明它的语句块,而声明周期则是函数执行期间。
第三,动态内存
这类内存空间分配在堆区,分配了的动态内存空间需要手动释放,否则会在程序运行期间一直存在。作用域由引用这块内存的指针决定,也就是说,只要得到动态内存的地址,就能够使用它。
重要运算符:
第一,取地址符&,它返回操作数地址——一个右值
第二,解引用符*,作用于指针,它返回指针指向的对象——一个左值
null概念
对于指针
null指针就是不指向任何内存位置的指针,空指针的值就是NULL宏,NULL宏的作用就是用来表示空指针的概念,在很多库中 NULL宏的定义就是一个 被void*类型进行了强制类型转换的整型常量0——( (void *) 0)。
两个空指针总是相等的
对于字符
NUL字符就是一个数据位全为0的字节,也就是一个值为0的字符,这个字符不可见,常常用于标识字符串的结尾。
对于字符串
就是空字符串,表示字符串不包含任何字符。但其实空字符串至少包含一个字符——NUL字符,因为C风格字符串是以NUL字符结尾的字符串。
对于语句
就是只有一个分号的语句
void指针
即类型为void的指针,void指针具有通用性,也就是说任何类型的指针都可以赋值给void类型指针,而void类型指针又可以赋值给任何类型的指针。
size_t
无符号类型,它的作用就是用来表示对象所能达到的最大尺寸
sizeof运算符
返回的整数值是以字节为单位的
认识几种典型的指针
空指针:值为NULL的指针
野指针:未初始化的指针
迷途指针:指向已释放的内存的指针
tip:任何类型的NULL指针之间都可以进行比较,并且返回真;访问野指针或迷途指针都会产生未定义的行为。
重复重要的东西:
总的来说,从基本概念上看,指针只是一种数据类型,它的值就是某个内存地址;但是指针真正的意义所在就是为程序员提供了管理内存的绝佳途径,因为指针存放的是某个内存地址,这意味着程序员可以对内存进行直接的操作,可以说使用指针的过程就是在跟内存打交道,在管理内存,因此,学会使用指针,理解指针将会对认识和理解数据在内存中的组织以及程序的工作原理有非常大的帮助!当然凡事都有两面性,指针的灵活和自动相应也带来了安全性的问题,如果使用不当,会造成诸如产生未定义行为,更有甚者会导致程序崩溃或操作系统崩溃。