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.mzph.cn/news/730925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka MQ 生产者和消费者

Kafka MQ 生产者和消费者 Kafka 的客户端就是 Kafka 系统的用户&#xff0c;它们被分为两种基本类型:生产者和消费者。除 此之外&#xff0c;还有其他高级客户端 API——用于数据集成的 Kafka Connect API 和用于流式处理 的 Kafka Streams。这些高级客户端 API 使用生产者和消…

突破编程_C++_设计模式(简单工厂模式)

1 简单工厂模式的概念 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是设计模式中的一种创建型模式。它的主要目的是将对象的实例化与使用解耦&#xff0c;使得客户端无需关心对象的创建细节&#xff0c;只需通过工厂类来获取所需的对象。 在简单工厂模式中&a…

线程安全--浅谈Ad-hoc与加锁的区别

浅谈Ad-hoc 与加锁 两者要解决的都是对对象的语义混乱操作&#xff0c;即有个count进行累加操作。 我的理解/文心一言的反馈如下: 加锁是保证我们对同一个count在多线程下的访问有序&#xff0c;即“读写-修改-写入”具有原子性。 而Ad-hoc机制就是通过程序员自己定义一个私有…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

一起来读李清照

当然先祝各位女生节日快乐&#x1f381;&#x1f381;啦​。​ 但是呢&#xff0c;今天&#xff0c;我们不聊技术&#xff0c;来聊点其他的。 大家都知道今天是三八妇女节&#xff0c;三八妇女节的是中国人的叫法&#xff0c;也叫国际妇女节。是为了纪念妇女权利的运动&#…

基于禁忌搜索算法(TS)的TSP(Python实现)

本篇文章是博主在最化优学习、人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在最优化算…

springboot248校园资产管理

校园资产管理 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园资产管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大…

CDN(内容分发网络):加速网站加载与优化用户体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

java——2024-03-03

String类的对象能被修改吗&#xff1f;如果不能需要用什么修改&#xff1f;StringBuilder和StringBuffer的区别&#xff1f;equals和区别谈谈对面向对象的理解重载和重写的区别说一下ArrayList&#xff0c;LinkedList底层实现以及区别什么是哈希冲突&#xff1f;hashMap和conCu…

mysql 8.0 日志文件无权限问题处理

无论如何修改权限总是报这个日志文件权限问题。 解决方法 输入指令&#xff1a; setenforce 0 systemctl restart mysgld

LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…

【Spring Cloud 2023】【ZooKeeper】服务注册与发现

【Spring Cloud 2023】【ZooKeeper】服务注册与发现 背景介绍开发环境开发步骤及源码一、创建提供服务的应用二、创建消费服务的应用工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入…

Java开发从入门到精通(一):JavaJava的基础语法知识高阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的数组1.1 静态初始化数组1.1.1 静态数组的定义1.1.2 数组的原理1.1.3 数组的访问1.1.3.1 数组的取值1.1.3.2 数组的赋值1.1.3.3 数组的长度1.1.3.4 数组的使用 1.1.4 数组的遍历1.1.3 数组的案例 1.2 动态初始化数组1…

WanAndroid(鸿蒙版)开发的第一篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 为了兼容HarmonyOS&#xff0c;我这边以Arkts--API9为例进行实现 通过华为官网渠道目前下载的版本还是3.1的&#xff0c;这边提供下4.0版本下载…

实用 Tips 分享|用 File Browser 上传大文件

在使用 OpenBayes 平台过程中&#xff0c;很多用户都会遇到上传大文件 (&#xff1e;100 G) 的情况&#xff0c;无论是上传至数据仓库&#xff0c;还是在工作空间中完成上传&#xff0c;过大的文件在传输过程中常会出现上传中断、速度过慢等情况。 针对这一问题&#xff0c;我…

从2个角度来简单讨论一下伦敦金走势图怎么看

进入伦敦金市场之后&#xff0c;投资者无时无刻都在思考着一个问题&#xff0c;那就是伦敦金走势怎么看&#xff1f;关于这个问题&#xff0c;其实在市场中有很多的文章和视频去介绍&#xff0c;在书店里也有很多投资前贤所写的书籍讨论过这个问题。但是他们都有一个特征&#…

python中[[“jfk“,“kul“],[“jfk“,“nrt“]]是如何进行sort()排序的

在Python中&#xff0c;列表&#xff08;list&#xff09;的sort()方法默认按照元素的字典顺序进行排序。对于包含字符串的列表&#xff0c;它会按照字符串的字典顺序&#xff08;即字母顺序&#xff09;进行排序。 然而&#xff0c;对于嵌套列表&#xff08;即列表中的元素也…

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数&#xff08;重点&a…

linux kernel物理内存概述(七)

目录 一、内核中小内存、频繁分配和释放场景 二、slab是内存池化技术 三、内核中使用slab对象池的地方 四、slab内核设计 使用比页小的内存&#xff0c;内核的处理方式使用slab 一、内核中小内存、频繁分配和释放场景 slab首先会向伙伴系统一次性申请一个或者多个物理内存…

医学大数据|文献阅读|有关“肠癌+机器学习”的研究记录

目录 1.机器学习算法识别结直肠癌中的免疫相关lncRNA signature 2.基于机器学习的糖酵解相关分子分类揭示了结直肠癌癌症患者预后、TME和免疫疗法的差异&#xff0c;2区7 3.整合深度学习-病理组学、放射组学和免疫评分预测结直肠癌肺转移患者术后结局 4.最新7.4分纯生信&am…