野指针,空指针,万能指针的理解

 一会儿要去上课辽,先更一点吧.

    总所周知,指针是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 
}
我总结的基本就这样了,欢迎大家点赞收藏加评论


 


 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值