当前位置: 首页 > news >正文

C语言-指针(下)

文章目录

  • 前言   
  • 文章目录

    前言

    一、指针运算

    1.指针+-整数

    2.指针-指针

    3.指针关系运算

    二、野指针

    1.概念

    2.野指针的成因

    1.未初始化

    2.指针越界访问

    3.指针指向的空间释放

    3.避免野指针

    1.指针初始化

    2.小心指针越界

    3. 指针变量不再使用时,及时置NULL

    总结


前言

本篇文章紧接着上篇指针内容,为大家讲解C语言指针的的更多知识内容,让大家更好的了解指针,以及可以熟练使用指针来解决实际问题。


一、指针运算

1.指针+-整数

数组在内存中是连续的

 #include <stdio.h>

 int main()

{
int arr[10]={1,2,3,4,5,6,7,8,9,10};

int *p= &arr[0];      //&arr[0]==arr
int i = 0;
int j = sizeof(arr)/sizeof(arr[0]);

for(i=0; i<j; i++)

{
printf("%d",*(p+i));       //p+i 这里就是指针+整数

}     
return 0;
}

2.指针-指针

指针-指针的运算前提是两个指针指向了同一空间。

int my_strlen(char*)

{

    char* pl = p;

    while(*p != '\0')

{
    p++;

}

     return p-pl;    //指针-指针
}
int main()

{
     char arr[]= "abcdef"://数组名其实是数组首元素的地址 arr == &arr[0]

     int len = my_strlen(arr);

     printf("%d\n",len);
     return 0;

}

3.指针关系运算

 #include <stdio.h>

 int main()

{
int arr[10]={1,2,3,4,5,6,7,8,9,10};

int *p= &arr[0];     
int i = 0;
int  j = sizeof(arr)/sizeof(arr[0]);

while(p<arr+j)    //指针大小比较

{
printf("%d",*p);   

}     
return 0;
}

二、野指针

1.概念

野指针:指针指向的位置是不可知的(随机,不正确,没有明确限制的)

2.野指针的成因

1.未初始化

int main()

{
int* p;     //局部变量:局部变量不初始化时,它的值是随机值

*p = 20;

printf("%d\n",*p);
return 0;

}

2.指针越界访问

 #include <stdio.h>
 int main()
{
int arr[10]={0};

int *p = &arr[0];

int i = 0;

for(i=0; i<=11; i++)

{
*(p++)= i;
 }                    // 当指针指向的范围超出数组arr的范围时,p就是野指针
return 0;

}

3.指针指向的空间释放

#include<stdio.h>
   int* no()

{
    int n=10;

   return &n;

}
 int main()

{
      int*p = no();

     printf("%d\n”,*p);

     return 0;

}

3.避免野指针

1.指针初始化

如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以使用NULL给指针赋值。NULL 是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。

#include <stdio.h>
int main()

{
int i = 10;

int*pl = &i;

int*p2 = NULL;
return 0;

}

2.小心指针越界


一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。

3. 指针变量不再使用时,及时置NULL

 指针使用之前检查有效性当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL,因为约定俗成的一个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。

int main()
{  

     int arr[10]={1,2,3,4,5,6,7,8,9,10};

     int *p= &arr[0];

     for(i=0;i<10; i++)

    {
           *(p++)= i ;
    }                                        //此时p已经越界了,可以把p置为NULL
      P= NULL;                       //下次使用的时候,判断p不为ULL的时候再使用


      p=&arr[0];                     //重新让p获得地址

      if(p != NULL)                  //判断

{

}
      return 0;

}


总结

以上内容为对上篇指针进行了补充和完善,为大家讲解了C语言指针的具体操作和一些注意事项,感谢各位的耐心观看,如果以上内容对大家学习有所帮助的话,希望大家可以点赞支持一下!

http://www.lryc.cn/news/313869.html

相关文章:

  • 尚硅谷JavaScript高级学习笔记
  • 六、长短时记忆网络语言模型(LSTM)
  • Filter过滤器+JWT令牌实现登陆验证
  • SQL学习十八~十九
  • 2024 AI 辅助研发的新纪年
  • 【牛客】HJ87 密码强度等级 CM62 井字棋
  • 【论文速读】 | DeGPT:通过大语言模型优化反编译器输出
  • 【DP】蓝桥杯第十三届-费用报销
  • 15. C++泛型与符号重载
  • 老司机都懂的!【打赏】完美运营的最新视频打赏系统
  • JavaWeb笔记 --- 二、Maven
  • 【C++】C++11---右值引用和移动语义
  • 消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性
  • 机器学习笔记 计算机视觉中的测距任务常见技术路线
  • 云计算 3月8号 (wordpress的搭建)
  • 【CSS】(浮动定位)易忘知识点汇总
  • Vitual Box虚拟机打开后,键盘鼠标失效
  • 宠物空气净化器值得入手吗?选购宠物空气净化器关注哪些方面?
  • 前端发起请求,后端模型需处理很久,怎样设置前端直接完成请求响应,后端计算完在返回结果给前端?
  • DDD领域驱动设计
  • 网络编程第1天
  • Springboot--整合Logback 日志框架(Maven)
  • 【考研数学】李林《880》vs 李永乐《660》完美使用搭配
  • Java面试之消息中间件
  • 网工学习 DHCP配置-接口模式
  • 【GO】语言特点 | Go和Java的对比
  • USB2.0设备检测过程信号分析
  • Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程
  • LabVIEW质谱仪开发与升级
  • SwiftUI之DragGesture