指针的深入了解2

1.const修饰指针

在这之前我们还学过static修饰变量,那我们用const来修饰一下变量会有什么样的效果呢?
我们来看看:

我们可以看到编译器报错告诉我们a变成了一个不可修改的值,我们在变量前加上了const进行限制,但是我们就不能改变a的值了吗?其实不然,我们刚刚学过指针,我们试试用指针能不能将其修改。

演示如下:

int main()
{
	const int a = 10;
	int* pt = &a;
	*pt = 2;
	printf("%d", a);
	return 0;
}

 我们来运行一下看看是不是改变了a的值。结果为:

虽然我们利用指针这个知识绕过a变量进行赋值的操作成功赋值 ,但是我们用const修饰变量就是让其固定,不想被修改,那我们可以怎样让指针也不能修改我们的a的值,其实我们也可以用const修饰指针这样就不能更改变量了。

演示如下:

此时我们用const修饰指针变量pt使其也成为一个不可修改的值,这样就不能通过指针变量来修改a了。但是const有几种修饰指针的情况,第一种就是上述的情况虽然我们限制*pt的值,但是我们可以改变pt的值,例如:

 此时就没有报错,说明此时的pt并没有被限制,被限制的知识*pt。还有一种情况我们将const放在int 后如int const*pt,此时限制的也是*pt那我们怎么限制pt呢?

其实我们只需要在pt的前面加上const即可。

演示如下:

此时编译器再次报错。说明我们成功将pt的值进行了限制,如果我们想让*pt和pt都被限制只需要使用 两个const即可。例如const int *const pt即可。

 2.指针的运算

1.指针的加减
1.指针加,我们来看一串代码
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10, };
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	int* pt = &arr[0];
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(pt + i));
	}
	return 0;
}

上述代码我们用指针的来完成打印数组的每一个元素。能不能完成我们的任务呢?

 我们通过指针的加i,每次都跳过一个整型。达到找到arr的每一个元素。

2.指针的减,我们也来看一串代码:
int main()
{
	int arr[] = { 1,2,3,4 };
	//我们将它的数子倒着打印出来
	int* pt = &arr[0];
	pt = pt + 3;
	for (int i = 0; i < 4; i++)
	{
		printf("%d ", *(pt - i));
	}
	return 0;
}

我们利用指针的减i来找到元素的地址,并进行解引用操作。

2.指针减指针

我们之前学过strlen库函数我们今天来写一个自己的strlen函数:

演示如下:

int my_strlen( char *pt)
{
	char* pu = pt;
	while (*pt!='\0')
	{
		pt++;
	}
	return pt - pu;
}
int main()
{
	char arr[] = "abcdef";
	int ret=my_strlen(arr);
	printf("%d", ret);
	return 0;
}

其实一维数组的传参就是首元素的地址。

我们来运行一下能不能完成我们的任务:

 3.野指针

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

1.野指针成因
1.未初始化
#include <stdio.h>
int main()
{
int *p; //局部变量指针未初始化,默认为随机值
*p = 20;
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++)
{
 //当指针指向的范围超出数组arr的范围时,p就是野指针
 *(p++) = i;
}
 return 0;
}
3. 指针指向的空间释放
#include <stdio.h>
int* test()
{
int n = 100;
return &n;
}
int main()
{
int*p = test();
printf("%d\n", *p);
return 0;
}
2.如何避免野指针
1.指针初始化

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

2. 小心指针越界

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

3. 指针变量不再使用时,及时置NULL,指针使用之前检查有效性

当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL。因为约定俗成的一个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。
我们可以把野指针想象成野狗,野狗放任不管是非常危险的,所以我们可以找一棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起来。
不过野狗即使拴起来我们也要绕着走,不能去挑逗野狗,有点危险;对于指针也是,在使用之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是不能直接使用,如果不是我们再去使用。

谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解与防范C语言中的栈溢出问题

一、引言 栈溢出是计算机安全领域中一个常见的漏洞&#xff0c;特别是在C语言编程中。由于C语言的灵活性和对内存管理的直接操作性&#xff0c;如果程序员在编写代码时不注意&#xff0c;就可能导致栈溢出的发生。本文将全面解析栈溢出的概念、原因、影响以及防范措施。 二、…

绘制太极图 - 使用 PyQt

大家好&#xff01;今天我们将一起来探讨一下如何使用PyQt&#xff0c;这是一个强大的Python库&#xff0c;来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学&#xff0c;而我们的代码将以大白话的方式向你揭示它的奥秘。 PyQt&#xff1a;是什么鬼&#xff1f; 首先&a…

嵌入式——窗口看门狗(WWDG)补充

目录 一、独立看门狗与窗口看门狗 1.功能描述 2.两者区别 二、WWDG功能描述 1.窗口看门狗时钟 2.计数器时钟 3. 计数器 4.窗口值 三、WWDG超时时间 一、独立看门狗与窗口看门狗 1.功能描述 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff0…

【GPU】GPU 硬件与 CUDA 程序开发工具

GPU 硬件与 CUDA 程序开发工具 笔记内容来自&#xff1a;《CUDA 编程&#xff1a;基础与实践》—樊哲勇 著 本文目录 GPU 硬件简介CUDA 程序开发工具CUDA 开发环境搭建用 nvidia-smi 检查与设置设备CUDA 的官方手册 GPU 硬件简介 GPU 是英文 graphics processing unit 的首字母…

【GitHub项目推荐--基于 AI 的口语训练平台】【转载】

Polyglot Polyglot 是一个开源的基于 AI 的口语训练平台客户端&#xff0c;可以在 Windows、Mac 上使用。 比如你想练习英语口语&#xff0c;只需在该平台配置一个虚拟的 AI 国外好友&#xff0c;你可以通过发语音的方式和 AI 好友交流&#xff0c;通过聊天的方式提升你的口…

黑马程序员——html css基础——day05——盒子模型

目录&#xff1a; 选择器 结构伪类选择器:nth-child(公式)伪元素选择器PxCook盒子模型 盒子模型-组成边框线 四个方向单方向边框线内边距尺寸计算外边距版心居中清除默认样式元素溢出外边距问题 合并现象外边距塌陷行内元素–内外边距问题圆角盒子阴影&#xff08;拓展&#x…

【Java】Spring的APO及事务

今日目标 能够理解AOP的作用 能够完成AOP的入门案例 能够理解AOP的工作流程 能够说出AOP的五种通知类型 能够完成"测量业务层接口万次执行效率"案例 能够掌握Spring事务配置 一、AOP 1 AOP简介 问题导入 问题1&#xff1a;AOP的作用是什么&#xff1f; 问题2&am…

java设计模式:工厂模式

1&#xff1a;在平常的开发工作中&#xff0c;我们可能会用到不同的设计模式&#xff0c;合理的使用设计模式&#xff0c;可以提高开发效率&#xff0c;提高代码质量&#xff0c;提高系统的可拓展性&#xff0c;今天来简单聊聊工厂模式。 2&#xff1a;工厂模式是一种创建对象的…

HCIP-交换机实验

实验拓扑 实验需求 实验思路 配置IP地址 配置vlan 实验步骤 配置IP地址 以pc1为例&#xff1a; 配置vlan 以sw1为例&#xff1a; <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys sw1 [sw1]vlan 3 Jan 28 2024 15:39:45-08:00 sw1 DS/…

HPE ProLiant MicroServer Gen8安装windows server 2019

按照《HP MicroServer Gen8使用官方工具安装Windows Sverver 2016教程》安装时&#xff0c;安装系统选项并没有server 2019可选&#xff0c;依然只是server 2012&#xff0c;我还以为是从单位拿回来的镜像有误&#xff0c;从官方下载了server 2019评估版&#xff0c;但依然只有…

【算法专题】二分查找(进阶)

&#x1f4d1;前言 本文主要是二分查找&#xff08;进阶&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

【UEFI实战】Redfish的BIOS实现——生成EDK数据

生成Redfish文件 Redfish数据的表示形式&#xff0c;最常用的是JSON。将JSON表示的数据转换成C语言可以操作的结构体&#xff0c;是必不可少的步骤。当然如果手动转换的话&#xff0c;需要浪费大量的时间&#xff0c;因此DMTF组织开发了一个工具&#xff0c;用于将JSON数据快速…

实验6:循环与子程序设计

1、实验目的&#xff1a; 通过完成将字节内存单元存储的8个数依次显示在屏幕上的程序设计&#xff0c;掌握循环与子程序设计的方法。 2、实验内容&#xff1a; 将内存单元存储的8个两位16进制数&#xff1a;01H, 25H, 38H, 62H, 8DH, 9AH, BAH, CEH依次显示在屏幕上。 3、实…

CSS设置单行文字水平垂直居中的方法

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>单行文字水平垂直居中</title><style>div {/* 给div设置宽高 */width: 400px;height: 200px;margin: 100px auto;background-color: red;/…

4.列表选择弹窗(CenterListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 在屏幕中间弹窗的列表选择弹窗。 1.布局 <?xml version"1.0" encoding"utf-8" ?> <toolkit:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"x…

【学网攻】 第(12)节 -- 动态路由(RIP)

系列文章目录 目录 系列文章目录 文章目录 文章目录 前言 一、动态路由是什么&#xff1f; 二、实验 1.引入 总结 文章目录 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4…

【GitHub项目推荐--推荐一个开源的任务管理工具(仿X书/X钉)】【转载】

推荐一个开源的任务管理工具&#xff0c;该工具会提供各类文档协作功能、在线思维导图、在线流程图、项目管理、任务分发、即时 IM&#xff0c;文件管理等等。该开源项目使用到 Vue、Element-UI、ECharts 等技术栈。 开源地址&#xff1a;www.github.com/kuaifan/dootask 预览地…

linux基础学习(8):grep命令、通配符、管道符

1.grep命令 1.1命令格式 grep 选项 "搜索内容" 文件名 选项&#xff1a; -i&#xff1a;忽略大小写 -n&#xff1a;输出行号 -v&#xff1a;查找文件内不含搜索内容的部分 --colorauto&#xff1a;把搜索内容用不同颜色标注出来 1.2grep命令与find命令的区…

class_19:抽象类(纯虚函数不能被实例化)

#include <iostream>using namespace std;class Teacher{ public:string name;string school;virtual void goinclass() 0;//纯虚函数不能被实例化 抽象类virtual void startclass() 0;//纯虚函数不能被实例化virtual void afterclass() 0;//纯虚函数不能被实例化 };…

分段函数线性化方法matlab测试

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…