首页 > 其他分享 >深入理解指针2:

深入理解指针2:

时间:2024-11-23 14:59:38浏览次数:11  
标签:const 函数 地址 理解 深入 swap 指针 变量

目录:

1:const修饰指针

2:野指针

3:assert断言

4:指针的使用和传址调用

(1)const修饰指针

1——1const修饰变量:

我们知道变量是可以修改的

我们可以看到图中a直接被修改为了20。

但是如果我们希望在这个变量上加一些限制,使得它不能被修改,需要怎么做呢?

引出:(const的使用)

 

当在a前面加上const的时候,若想在修改a就会报出警告。

此时a被const修饰变成了常变量(本质还是变量,但是不能被修改)==>如何证明本质是变量呢?

证明本质还是变量:

数组的创建时:规定:需要指定大小,而数组的大小的指定必须是常量!

[  ]中输入变量的时候:会报错。

当用const修饰后,依然会报错====>证明n的本质还是一个变量,只是具有了常属性。

我们使用const的目的是为了规定其不能被修改

1——2:const修饰指针变量

const修饰指针变量,可以放在*右边,也可以放在*左边,意义不同。

情况1:const在*左边

(可以看到图中*p指向a地址的数值不可被改变,但是使*p指向变量b的操作是可行的)

结论:const放在*的左边时:修饰的是指针指向的内容!!保证了指向的内org不会被修改,

但是指针变量本身的内容可以改变。
 

情况2:const在*右边

(图中*p所指向的变量a是可以被改变的,但是p指向b的操作会报错)

结论:const放在*右边时:修饰的是指针变量本身!!保证指针变量的内容不会被修改,

但是变量指向的内容,可以通过指针改变。

(2)野指针

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

2——1:野指针的成因

1:指针未初始化:

2:指针越界访问:

3:指针指向的空间释放:

int n是在函数text中创建的局部变量,n占的4个字节的空间,当函数texet返回后,n的空间就还给了操作系统,当*p在接收n地址的一瞬间,就变成了野指针。

2——2:如何规避野指针

1:如果指针有明确的指向,直接给出明确的地址:

int a=10;         int*p=&a;

2:如果指针变量,当前还不知道指向哪里,这个时候初始化为NULL======>    int*p=NULL;

NULL是c语言中定义的一个标识符常量。值是0,  0也是地址,但是这个地址是无法使用的,读取改地址会报错

3:当指针不再使用的时候,及时置为NULL,使用前检查其有效性

……………………

(3):arrest断言:

assert.h 头文件定义了宏assert(),用于在运行时确保程序符合指定条件,如果不符合,就会报错终止运行。这个宏被称为“断言”。、

assert()宏接受一个表达式作为一个参数,

若表达式为真,程序继续运行

若表达式为假,assert()就会报错:显示没有通过的表达式,以及此表达式的文件名和行号

(4)指针的使用和传址调用

我们学习指针的目的就是解决问题,那么什么样的问题,非指针不可呢?

题目:写一个函数,交换两个整形变量的值。

方法1:

在方法一中我们将a b的值传给了函数,而后创建空变量将其交换

这里简单介绍一下变量交换的基本方法:

1:首先创建一个空变量,给其附上a的值,此时n中就变成了10

2:再将x的值赋给y,此时y就变成了10;

3:最后再将y的值赋给x,实现两个变量的交换。

但是为什么这里的结果没有进行交换呢????

调试一下我们就能发现问题所在:

我们在main函数的内部创建的变量 a 的地址是 0x123ffa44 , b 的地址是 0x012ffa38

在调用函数时,将a b的值传递给了swap函数,

在函数swap内部确实接收到了a b的值,但是 a b的地址与 x y的地址不同;是相于x,y的独立空间

所以在swap函数内部交换的值自然不会影响a b

这种方式传参叫作:传值调用

得到结论:实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实参,所以swap函数失败了。

那么应该怎么办呢?

我们想要达到的操作是在swap函数内部操作的就是main函数中的a和b===>那么就可以用到指针的知识了,直接将a b的地址传递给swap函数,在swap中通过指针间接操作main函数中的a和b

可以看到,本次swap函数顺利完成任务,这里调用函数的时候将变量的地址传递给了函数

这种调用函数的方式叫:传址调用

总结:传址调用:可以让函数与主调函数之间建立真正的联系,在函数的内部可以修改主调函数中的变量;所以在未来函数中只需要主函数中的变量值来实现计算,就可以使用传值调用。

若函数内部需要修改主调函数中的变量的值,就需要用传址调用。

感谢观看~

标签:const,函数,地址,理解,深入,swap,指针,变量
From: https://blog.csdn.net/2402_88547413/article/details/143912678

相关文章

  • 深入学习scanf()的使用方法
    众所周知,C语言的scanf()位于<stdio.h>,用于输入数据,但一直以来我都对它的使用方式似懂非懂,今天我们来详细聊聊它。scanf意为“scanformat”,即格式化输入,原型如下:intscanf(constchar*format,...);一、基础使用方式#include<stdio.h>intmain(){intnum=0;sca......
  • 基于Spring Boot + Vue 的应届生毕业管理系统:打造智慧化毕业管理解决方案
    个人名片......
  • x-cmd pkg | nexttrace - 可视化路由跟踪工具,支持多种 IP 数据库,助你深入解析网络路径
    目录简介快速上手安装使用功能特点竞品和相关作品进一步阅读简介nexttrace是github.com/nxtrace用Go开发的可视化路由跟踪工具,用于分析从源到目标的网络路径。它默认使用ICMP协议发起TraceRoute请求,支持IPv4和IPv6,支持指定网卡进行路由跟踪,支持TTL控......
  • 理解UART 子系统:Linux Kernel 4.9.88 中的核心结构体与设计详解
    往期内容本专栏往期内容:Uart子系统UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解Linux串口应用编程:从UART到GPS模块及字符设备驱动interrupt子系统专栏:专栏地址:interrupt子系统Linux链式与层级中断控制器讲解:原理与驱动开发–末片,有专栏内容观看顺序......
  • C语言:函数指针精讲
    1、函数指针一个函数总是占用一段连续的内存区域,函数名在表达式中有事也会被转换为该函数所在内存区域的首地址,这和数组名非常类似,我们可以把函数这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就......
  • 你对响应式设计的理解是什么?知道它基本的原理是吗?要想兼容低版本的IE怎么做呢?
    我对响应式设计的理解是,它是一种网页设计方法,旨在使网站能够在各种设备(从桌面电脑到移动电话和平板电脑)上提供最佳的浏览体验。这意味着网站的布局、图像和内容会根据用户所使用的设备的屏幕大小和方向自动调整。响应式设计的基本原理包括:流式布局(FluidGrids):使用相对单位(如百......
  • 说说你对RESTful的理解
    RESTful,RepresentationalStateTransfer的缩写,是一种软件架构风格,它定义了一组用于创建Web服务的约束和原则。在前端开发中,我们主要通过HTTP协议与遵循RESTful原则的后端API进行交互。我的理解如下:核心概念:资源(Resources):RESTfulAPI的核心是资源。资源可以是......
  • Servlet -个人理解笔记
    Servlet的作用        Servlet主要是为了衔接web应用的前端和后端的,作为它们俩中间数据交换的桥梁,现在很多web项目都是前后端分离的,前端写前端的后端写后端的,但是他俩所用的编程语言是有区别的,怎么实现它们之间的数据交换呢?Servlet就是为了解决这个,它是用java编写的,目......
  • 深入浅出:SpringBoot启动流程源码分析(持续更新中......)最新日期:2024年10月29日
    Hello,大家好,我是此林。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?SpringBoot启动类很简单,只有一行代码。我们点进run()方法。我们发现,它底层其实进行了两步操作。第一步是new出一个SpringApplication对象,第二个是......
  • pnpui.dll是什么?深入了解pnpui.dll其重要性及缺失应对方法
    pnpui.dll是Windows操作系统中的一个关键动态链接库(DLL)文件,它与即插即用(PlugandPlay,PnP)功能密切相关。以下是对pnpui.dll的详细介绍,包括其重要性以及缺失时的应对方法。一、pnpui.dll的概述定义:pnpui.dll是Windows操作系统中的一个DLL文件,负责处理与即插即用功能相关的用......