C语言初阶(10)

1.野指针

野指针就是指向未知空间的指针,有以下几种情况

(1)指针未初始化

cs 复制代码
int main()
{

   int a=0;
   int*b;
   return 0;
}

上面指针就是没有初始化,形成一种指向一个随机空间的地址的指针,我们可以修改成

cs 复制代码
int main()
{

   int a=0;
   int*b=NULL;
   return 0;
}

(2)数组越界访问

数组下标超过数组本身下标时就会造成形成野指针

cs 复制代码
int main()
{
   int a[10]={0};
   int *b=arr+10;
   return 0;
}

上面b就是野指针,野指针指向数组后未知的数据

(3)局部变量的指针

非主函数局部变量的地址存在主函数指针中就会形成野指针,由于指针指向的空间是有可能被销毁和未知,和不属于程序还给操作系统,如下例

上面就说明野指针的危害

总结:野指针种类有许多,只要不确定和不受我们掌控的指针我们就可以归类成野指针。

我们应该做到以下几点来避免野指针

  1. 指针初始化 2. 小心指针越界 3. 指针指向空间释放即使置NULL 4. 避免返回局部变量的地址 5. 指针使用之前检查有效性

2.指针的运算

指针的加1或者减1都是将根据指针的不同权限将指针后移1个或多个地址

指针之间的减法是计算同种数据类型(也就是有相同权限)的之间的元素个数,结果的绝对值就是元素个数,所以我们就可以简化求字符串长度的函数

指针之间的加法没有意义

指针之间的逻辑运算

指针之间的> < => =<都是有意义,指针在数组中的指针是由大到小的。我们要注意的是在C语言的标准中指针的比较要求和数组前面的进行比较,而不是和后面进行比较。

3.数组和指针

数组中存放的相同类型的数据,指针变量存放的是所指向的地址,我们就可以将指针存放在数组中,形成指针数组,例如

cs 复制代码
int main()
{
  int a=0;
  int c=0;
  int *b[2]={&a,&c};

}

我们可以通过访问数组的形式来进行访问指针对应的空间。

我们还可以通过这样的形式建立二维数组并打印

数组名的是首元素的指针,这就是数组和指针之间的联系

数组在访问时arr1相当于*(arr+1)的形式,二者时等价于。

4.二级指针

二级指针是存储一级指针的地址的变量,格式是

cs 复制代码
int main()
{

  int a=1;
  int*b=&a;
  int**c=&b;

}

int*代表了二级指针的指向的空间的数据类型 ,*代表存放的是指针

同样的我们可以将二级指针指向一级指针,然后再获取一级指针的内容。

相关推荐
H.莓飛13 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu11414 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶15 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子15 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放15 小时前
面向对象高级(实战案例)
开发语言·python·学习
·present·16 小时前
CSAPP(lecture 4_01)
c语言·c++
fanruitian16 小时前
python else用法
开发语言·python
FRing0316 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿16 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_4173968317 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电