C语言指针—野指针、指针运算、指针与数组

news2024/11/28 6:30:05

野指针

指针未初始化

int main()

{
    int *p;
    //没有初始化,就意味着没有明确的方向
    //一个局部变量不初始化,放的是随机值:0xCCCCCCCC
    //请注意,这个地址并不是我们定义的,是一个非法的地址
    
    *p = 10;//非法访问内存了,这里的p就是野指针
    
    return 0;
}

指针越界访问

int main()
{
    int arr[10] = { 0 };
    int* p = arr;//arr[0]首元素地址,p指向数组第一个元素
    int i = 0;
    for (i = 0; i <= 11; i++)
    {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
    }
    return 0;
}

指针指向的空间释放

int* test()
{
    int a = 10;
    return &a;//出函数时a被销毁
}


int main()
{
    int* p = test();//传回了a的地址,但是a已经被销毁了,这个地址谁也不知道还有什么
    return 0;
}

如何避免野指针的出现

  • 指针初始化
int* p = NULL;//空指针
//如果被空指针被解引用赋值会发生异常

那么当我们以后去使用指针时,应该先去询问

if(p != NULL)
{
    *p = 1;
}
int main()
{
    int* p = NULL;
    //....
    int a = 10;
    p = &a;
    if (p != NULL)
    {
        *p = 20;
    }
    return 0;
}

指针运算

指针±整数

#define N_VALUES 5//宏定义常量
float values[N_VALUES];//定义浮点型数组
float *vp;//注意了,这里虽然是野指针但是我们并未使用它
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)//初始化指针了
    //在这里遍历数组地址
{
     *vp++ = 0;//后置++,先使用后++,先解引用,再++,所以一次可以移动一个元素
}
int main()
{
    int arr[10] = {0};
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    //数组下标写法
    //for (i = 0; i < sz; i++)
    //{
    //    arr[1] = 1;
    //}
    //写法1
    //int* p = arr;
    //for (i = 0; i < sz; i++)
    //{
    //    *p = 1;
    //    p++;
    //}
    int* p = arr;
    for (i = 0; i < sz; i++)
    {
        *(p + i) = 1;
    }
    return 0;
}

指针相减

我们来看下面的式子的运算结果

int main()
{
    int arr[10] = { 0 };
    printf("%d", &arr[9] - &arr[0]);
    return 0;
}

我们直接来看结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

int main()
{
    int arr[10] = { 0 };
    printf("%d", &arr[0] - &arr[9]);
    return 0;
}

image-20240409204343247

指针减去指针的绝对值得到的是指针和指针之间的元素个数

**注意:**不是所有的指针都能相减

指向同一块空间的指针相减才会有意义

计算字符串长度

int my_strlen(char *s)
{
       char *p = s;
       while(*p != '\0' )
              p++;
       return p-s;
}

那这样我们就可以很简单的计算出字符串长度

指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{
   *--vp = 0;
}

这个代码之前写过,但是是不是还能简化一下

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}
但是:

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

标准规定:

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。


数组和指针

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

image-20240409204307130

数组:一组相同类型的元素集合

指针变量:是一个变量,存放的是数组

int main()
{
    int arr[10] = { 0 };
    //arr是首元素的地址
    //&arr[0]
    int* p = arr;
    //通过指针来访问数组
    
    return 0;
}

但是,数组就是数组,指针就是指针,二者不能混为一谈

既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。

#include <stdio.h>
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,0};
    int *p = arr; //指针存放数组首元素的地址
    int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    for(i=0; i<sz; i++)
   {
        printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);
   }
    return 0;
}

image-20240409204608438

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581937.html

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

相关文章

Unity面经(自整)——移动开发与Shader

Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包&#xff0c;用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序&#xff08;一套代码跨平台构建app是它最大的优点&#xff09;&#xff0c;并且可以构建高性能、稳定和丰富UI的应用程…

Spring MVC体系结构和处理请求控制器(一)

一、MVC模式 MVC模式是指Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;是开发Web应用程序时常用的一种代码分层模式MVC模式是软件工程中的一种架构模式&#xff0c;会强制行的把系统的输入、处理和输出分开&#xff0c;是系统从功能上形成M…

评论发布完整篇(react版)

此篇文章阐述评论的最新、最热之间的tab标签切换&#xff08;包括当前所在tab标签的高亮显示问题&#xff09;&#xff1b;当前评论的删除&#xff1b;除此之外还延伸了用户的评论实时发布功能。其中最新tab标签所展示的内容是根据当前评论点赞数来进行排序&#xff0c;点赞数量…

数字社会下的智慧公厕:构筑智慧城市的重要组成部分

智慧城市已经成为现代城市发展的趋势&#xff0c;而其中的数字化转型更是推动未来社会治理体系和治理能力现代化的必然要求。在智慧城市建设中&#xff0c;智慧公厕作为一种新形态的信息化公共厕所&#xff0c;扮演着重要角色。本文智慧公厕源头实力厂家广州中期科技有限公司&a…

Go gin框架(详细版)

目录 0. 为什么会有Go 1. 环境搭建 2. 单-请求&&返回-样例 3. RESTful API 3.1 首先什么是RESTful API 3.2 Gin框架支持RESTful API的开发 4. 返回前端代码 go.main index.html 5. 添加静态文件 main.go 改动的地方 index.html 改动的地方 style.css 改动…

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

力扣121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int数组max大小同prices&#xff1b;定义int变量curMax初始化为0&#xff1b; 2.从后往前遍历数组&#xff0c;若当前元素prices[i] > curMax时&#xff0c;则使将其赋值给curMa…

医院预约系统微信小程序APP前后端

医院预约系统具体功能介绍&#xff1a;展示信息、可以注册和登录&#xff0c; 预约&#xff08;包含各个科室的预约&#xff0c;可以预约每个各个医生&#xff09;&#xff0c;就诊引导包含预约的具体信息&#xff0c;包含就诊时间、就诊科室、就诊医生以及就诊人信息、和支付状…

如何注册midjourney账号

注册Midjourney账号比较简单&#xff0c;准备好上网工具&#xff0c;进入官网 Midjourney访问地址&#xff1a; https://www.midjourney.com/ 目前没有免费使用额度了&#xff0c;会员最低 10 美元/月&#xff0c;一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

019——IIC模块驱动开发(基于EEPROM【AT24C02】和I.MX6uLL)

目录 一、 IIC基础知识 二、Linux中的IIC&#xff08;韦东山老师的学习笔记&#xff09; 1. I2C驱动程序的层次 2. I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 三、 AT24C02 介绍 四、 AT24C02驱动开发 实验 驱动程序 应用程序 一、 IIC基础知识 总线类…

【linux】谈MobaXterm支持的连接方式

目前远程联机服务器主要有文字命令行接口和图形界面接口两种。 一、命令行接口方式 1.1 加密传输-SSH SSH为主&#xff0c;目前大多在网络上的数据封包都是加密的技术&#xff0c;等到传输的封包加密后再传输到网络上&#xff0c;以增加数据在Internet上面传送的安全性 1.2…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

Solid Converter 10.1下载地址及安装教程

Solid Converter 10是一款专业的PDF转换工具&#xff0c;用于将PDF文件转换为可编辑的文档格式&#xff0c;如Word、Excel、PowerPoint等。它提供了强大的转换功能和一系列实用的工具&#xff0c;帮助用户将PDF内容转换为可重复使用和编辑的格式。 Solid Converter 10的主要功…

vcruntime140.dll文件缺失的多种解决方法,这五种修复vcruntime140.dll绝对有效

当你在使用电脑的时候&#xff0c;可能会遇到一个提示错误&#xff0c;显示“vcruntime140.dll文件缺失&#xff0c;程序因此无法启动”。这种状况不但打断了你的日常使用&#xff0c;还可能对你的工作效率造成不利影响。为了助你更好地搞清楚这个问题的由来以及解决方案&#…

贪心算法|860.柠檬水找零

力扣题目链接 class Solution { public:bool lemonadeChange(vector<int>& bills) {int five 0, ten 0, twenty 0;for (int bill : bills) {// 情况一if (bill 5) five;// 情况二if (bill 10) {if (five < 0) return false;ten;five--;}// 情况三if (bill …

基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242

摘 要 使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的人事管理…

【C++】探索C++中的类与对象(下)---深入理解C++中的关键概念与应用

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 在C编程中&#xff0c;有许多重要的概念和特性&#xff0c;包括构造函数、explicit关键字、静态成员、友元以及内部类…

【Web世界探险家】CSS美学(一)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…