一会儿要去上课辽,先更一点吧.
总所周知,指针是c的灵魂所在,因为能够接触硬件的东西,所以能写出更高效的代码,但是这是有代价的,就是c指针是非常难以掌握的一个东西,不少程序员都晕针,比如我,今天我就来整理整理相关的一些关于指针的问题。
首先是野指针啊
啥是野指针嘞,顾名思义,没人要的指针,出现的原因通常是因为你自己定义了一个指针,但并没有说明指针具体指向谁,就会导致野指针的出现,野指针会随意指向某一块内存,但是一般用的人都没意识到这是一个野指针。而野指针的出现是有危害的,据说容易被黑客攻击,但具体原因大家自行百度,我也不敢乱讲。//补上,野指针可能会指向系统的保护内存,程序就会被终止。
#include <stdio.h>
int main()
{
int *p;
printf("%d",p);
return 0;
} 这个就是野指针,打印出来的地址是随机的,因此这里有一个建议,就是定义指针的时候,越早让其指向某个地址越好。
二。 然后讲讲空指针,空指针是啥嘞?
顾名思义就是让指针指向NULL,形如int *p=NULL ,在这里解释一下NULL是啥,NULL其实是一个宏定义,NULL 宏是强制类型转换为 void 指针的整数常量 0 在很多库中定义如下: #define NULL ((void *)0) (不懂以后会懂,虽然我也不懂)
#include <stdio.h>
int main()
{
int *p=NULL;
printf("%d\n",p);
printf("%d\n",*p);
return 0;
} 方便大家理解,这里列了代码,结果是0 和 空。
那空指针有什么用嘞?拿来判断用的(但是因为刚学,等我找到例子,我会把这段补上。)
然后是空指针的一个特性,就是你不能对空指针进行使用和操作,但是可以使空指针指向的地址改变
#include <stdio.h>
int main()
{
int a=3;
int *p=NULL;
p=&a;
} 也就是说,这样写是合法的。
接着讲讲万能指针,也就是void类型的指针
void 指针称作“万能指针”,形如void *p.这主要是因为任意指针都可以使用 void 指针传递,并且编译器不会报出“类型不匹配”相关的警告。我的理解是,因为有时候我们对一个变量的数据类型不了解,乱定义指针的类型可能会导致错误,所以空指针会用于接收指针然后用强转成想要的类型。
这里举个例子,比如
#include <stdio.h>
int main()
{
int a=3;
char *p=NULL;
p=&a;
printf("%d",p);
} 这样其实会有warning的,因为指针和变量a的数据类型不匹配。
有时候代码很长,我们不了解一个变量的具体数据类型,因此我们需要有一个解决的办法,就是万能指针。使用的时候需要强制转换类型
比如下面这个代码
这样就会报错,因为类型不匹配,这时候需要强制转换类型。在这里说一下,强制类型转换数据类型改多或改少都可能会出现问题
所以刚刚那个代码可以这样改
#include <stdio.h>
int main()
{
int a=3;
void *p=&a;
*(int *)p=100;
printf("%d",a);
} 这样的a的结果就可以改成100了
另外,打印万能指针所指向的值的时候,因为是void类型,机器不知道读取多大的内存空间,因此也是需要强制类型转换
#include <stdio.h>
int main()
{
int a=3;
void *p=&a;
*(int *)p=100;
printf("%d\n",a);
printf("%d",*(int *)p);
} 如左边的代码,这样强制转换告诉机器读取4个字节
还有一点,万能指针和数组
#include <stdio.h>
int main()
{
int arr[10];
void *p=arr;
*(int *)p=100; //这里的意思是把数组的第一个单元改成100,即arr[1]改成100
*((int *)p+4)=200; //这里的意思是把arr[5]改成200。操作的过程是先把p强制转换,然后在p的 地址上加4
}
我总结的基本就这样了,欢迎大家点赞收藏加评论