1.指针到底是什么
指针的实质就是个变量与常规变量没有任何本质区别相同。 指针的完整名称称为指针变量,应该只称为指针。
代码//a的本质其实是编译器中的符号,编译器中连接a和内存空间//的内存空间是a表示的变量。 int a; 定义//int类型变量,名称为aint *p; //定义了指针变量。 名称为p,p指向int型变量a=4。 //可操作p=4; //编译器不允许。 因为指针变量实质上也是普通变量,但其//用途与普通变量不同。 指针变量必须存储另一个变量的地址///,而不是存储任何int类型的数量。 p=(int* ) 4; //我知道其实是数字4,但是把类型转换为int *型的4//,相当于告诉编译器这4其实是地址,(而且是int型变量//的地址)的话,(int * ) 4是
2.为什么需要指针?
指针的出现是为了实现间接访问,间接存取(CPU的间接寻址)而在CPU设计时决定的,这决定了汇编语言可以实现间接寻址,汇编上的C语言也是简档寻址
3.指针使用三部曲:定义指针变量、关联指针变量、解引用
//演示指针的标准用法//指针的使用分为三个步骤。 指针变量的定义、指针变量的赋值(指针绑定)、取消引用int a=23在第一步中,定义指针变量int *p的printf(p=%p.n )、p ); //%p打印指针和%x打印指针,打印的值为相同的printf(p=0x%x.n ',p ); //第2步,绑定指针,实际上就是给指针变量赋值。 这意味着,除非//绑定指针变量以使指针指向另一个变量,否则无法取消引用该指针。 p=a; //实现指针绑定,使p指向变量AP=(int* ) 4; //实现指针的绑定,并且按照p指向存储器地址为4的变量//步骤3的方式,取消引用。 //如果在未将指针绑定到某个变量的情况下解析引用,则几乎一定会出现错误。 *p=555; //555放入p所指变量中
)1)如果我们假设int *p定义一个指针变量p时,则p为局部变量,所以c语言的局部变量的一般规律(在定义了局部变量且没有初始化的情况下,值是随机的) )
)2)这时,如果我们存储的是一个随机的数字,就相当于我们解引用p的访问了。 由于不知道是否可以访问该空间,因此如果直接定义指针变量在不绑定有效地址的情况下解析引用,则可能会发生错误。
)3)定义指针变量,随机数字为地址的内存空间取消引用而不绑定有效地址。
)4)指针绑定的含义是指向可以访问、应该访问的位置。 指针的不能
解引用是为了间接访问目标变量
(1)野指针是指针指向4.什么是野指针?的位置的随机的、不正确的、没有明确限制
)2)如果指针变量在定义时没有初始化,则值也是随机的,运行时为。
)3)由于野指针无法预测指向地址,因此无法预测段错误。
3种情况是指不可访问且操作系统不允许访问的敏感地址,如内核空间地址,从而导致触发器段错误。
第一种:(例如,我们曾经使用过但已经没有使用过的堆栈空间或堆空间)此时,程序的执行没有错误,也不会对当前的程序造成损害。
在第二种是指向一个可用的、而且没什么特别意义的空间(例如,程序的变量x )的情况下,野指针的解引用正好修改这个变量x的值,这个变量被莫名其妙地变更,或者程序发生奇怪的错误的危险最大。
第三种情况就是指向了一个可用的空间,而且这个空间其实在程序中正在被使用
(1)野指针错误的发生源是定义既未初始化也未赋值,解除引用。 因此,在取消引用指针之前,请确保指针指向绝对可用的区域。
-定义指针时,同时初始化为空值
-在指针释放引用之前,确定此指针是否为空
-使用指针后,将其分配为空
-在使用指针之前,将分配绑定到可用的地址空间
int b,a=5; int *p=NULL; p=a; //正确使用指针的方法是在取消引用指针之前将if(null )绑定到绝对可用的地址!=p ) {b=*p; (}p=NULL; 请记住使用//指针变量,然后将其重新赋值为NULL(2)5.怎么避免野指针?。 然后,将指针代入空值。 实际上,指针指向在普通操作系统中无法访问的0地址。