基础指针【指针的基本使用方法和注意事项】

2023-11-01

前言

指针,是我们在学习C语言中的一个重难点,关乎到我们学习C语言的深度和理解,所以,想要学好C语言,在学习C语言的时候就一定要将指针学懂学透。下面是我对C语言的粗糙理解,如果可以帮到大家那是最好不过了,要是有什么不对地方,也希望大家可以提醒我一句。

指针

指针是什么

指针是内存中的地址,是内存中的各个数据的门牌号。

大家可以将计算机类比成我们的现实世界,我们的世界是被分为一个一个空间的,我们就生活在一个一个的空间里面,每个空间都会有独立的编号或者名称(这就像我们点外卖的时候我们会有一个地址,可以让外卖小哥将外卖准确无误地将外卖送到我们手里)。

在这里插入图片描述

在内存中也是,对于各个数据,我们都有一块相对独立的空间来存放,对于每个数据,都会有一片独立的空间来存储。这时也就会有一个对应的编号来指向这块空间,这个编号也就叫做地址,而指针就是专门用来存放这个地址的。

在这里插入图片描述

指针的大小

指针变量指针变量,只要是变量,就应该需要内存来存储它,而指针在内存中存储需要占用多少个字节呢?对于其他数据类型,指针有点不一样的地方,其他数据类型都有明确的大小,并且在任何环境下都不会改变。而指针需要看是在什么环境下运行的

  • 32位的机器下,指针是占用4个字节的。
    在这里插入图片描述
  • 64位的机器下,指针是占用8个字节的。
    在这里插入图片描述

指针的定义和赋值

指针在定义的时候需要声明指向的数据的类型,这也决定了这个指针的步长(在进行±运算或者读取的时候需要±或者读取多少个字节)。 这就像数组一样,我们需要在定义数组的时候定义好长度和元素个数。

int num = 9; 
int* ptr_num = #		//int类型的指针指向int类型的变量的地址
char ch = 'A';
char* ptr_ch = &ch; 		//char类型的指针指向char类型的变量的地址

在给指针赋值的时候,需要注意要不要带上取地址符号&,因为指针内部存储的是地址。需要注意的是,如果是存储数组的地址的时候,就不需要带上&符号了,因为数组名本身就是数组的首地址。因为在 &数组名 就是整个数组的地址了,这样进行± 运算的时候就是±整个数组的长度了。像这样的情况还有一个 sizeof(数组名),这样出现计算出来的也会是整个数组的长度。

指针的使用

在使用指针所指向的空间的值的时候,需要在指针前面加上*解引用符号,因为我们的指针是指向内存中某一处空间里的变量,所以在使用的时候如果改变该指针指向的空间的值,存储在该空间的变量的值也会发生改变。

int num = 9; 
int* ptr_num = #
printf("%d\n", num);//9
printf("%d\n", *ptr_num);//9
*ptr_num = 1;
printf("%d\n", num);//1
printf("%d\n", *ptr_num);//1

传值调用和传址调用

我们都知道,函数的形参是对实参的一份临时拷贝,在函数中改变形参的变量并不会改变实参的变量。我们就不能通过函数来改变实参的值,现在我们学习了指针,就可以实现实参的值的改变了。我们通过一个交换两数的值的小案列来讲解一下。

传值调用

void swap(int a, int b) {  //实参的临时拷贝
	int c = a; 
	a = b; 
	b = c;
}

int main() {
	int a = 3;	
	int b = 8;
	printf("交换前:\n a = %d , b = %d\n", a, b);  //a = 3, b = 8
	swap(a, b);	 //将变量的值传给函数
	printf("交换后:\n a = %d , b = %d\n", a, b);  //a = 3, b = 8
	return 0;
}

可以看到,函数在进行传值调用的时候,改变形参的值不会改变实参的值,并不能起到交换两数的值的作用。

传址调用

void swap(int* a, int* b) {  //使用指针接受变量的地址
	int c = *a; 
	*a = *b; 
	*b = c;
}

int main() {
	int a = 3;	
	int b = 8;
	printf("交换前:\n a = %d , b = %d\n", a, b); //a = 3, b = 8
	swap(&a, &b);//将变量的地址传给函数
	printf("交换后:\n a = %d , b = %d\n", a, b); //a = 8, b = 3
	return 0;
}

进行传值调用的时候,函数得到的是存储变量的地址,这时候就可以交换两数的值了。需要注意的是,在进行传址调用的时候是需要传地址的,函数接收是使用指针接收的,千万不要和传值搞混了。

指针的弊端

指针就像是一把双刃剑,我们可以灵活地使用指针来进行编写代码,达到我们想要的目的。但是如果指针使用不当的话就有可能造成系统的损坏。就像传址调用可以改变实参的值,如果我们使用了一个不知道指向何处的指针,那么就有可能改变一个系统的值,系统就有可能出问题。

野指针

野指针就是指向未分配或者已经释放的内存地址的指针。 当我们使用野指针的时候就有可能发生难以挽回的损失。所以在使用指针的时候我们要格外小心。

int* ptr; //野指针,局部变量没有赋初始值的时候会自动赋值为随机值

使用指针的注意事项

定义的时候我们需要及时将指针赋值,如果没有想赋的值我们可以让指针指向NULL

int* ptr = NULL;

在使用完动态内存后也需要使用free函数将内存释放。

 int * buffer1;
 buffer1 = (int*) malloc (100*sizeof(int));
 free(buffer1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础指针【指针的基本使用方法和注意事项】 的相关文章

  • JSP out.write()方法具有什么功能呢?

    转自 JSP out write 方法具有什么功能呢 下文讲述out对象中write 方法的功能简介说明 如下所示 out write 方法的功能 用于输出字符串 注意事项 out write 方法只能输出字符 当放入的信息是数字时 会转换
  • jwt的基本使用

    文章目录 介绍 用途 解决跨域访问的问题 原理 JWT 的数据结构 JWT基本使用 介绍 JWT是json web token缩写 它将用户信息加密到token里 服务器不保存任何用户信息 服务器通过使用保存的密钥验证token的正确性 只
  • 什么?居然有人把图片从 1M 优化到 1024kb

    前两天刷知乎热搜看到一篇帖子 某省会城市健康码连续两次崩溃 相关公司在之前的报道中还声称 用两天两夜 将 1M 图片优化到 100kb 报道中提到 为了确保系统运行更高效 他们将一张图片从 1MB 压缩到 500 KB 再从 500KB 优
  • springboot html vue.js 前后分离代码示例

    1 html table class table table hover thead tr th style width 50px div class checkbox d inline div th tr thead table

随机推荐

  • 揭晓eval(function(p,a,c,k,e,r)js代码解密加密程序

    最近大雄搜集站 在弄改一个wp网站侧边栏的小工具就发现了 JS的代码脚本很乱 不是常规写法 后来查阅发现是由于JS加密造成的 我对这种事情很不理解 有一些既然是选择开源了 为啥JS还加密 走你 那就一起一波骚操作解密它 首先如果你发现你的J
  • 解决:Java source1.5不支持diamond运算符

    diamond运算符 指的是JDK1 7的一个新特性而Maven默认用的是JDK1 5去编译 对于这个问题 这里提供以下两种方案 1 在项目的pom xml中加入以下的配置 这种方法只只对当前的模块或者项目
  • 编码报错:‘gbk‘ codec can‘t decode byte 0xb5

    编解码问题 gbk codec can t decode byte 0xb5 今天抓取数据时 对抓取的数据进行处理时发现是乱码 如图所示 使用gbk和utf 8对其进行编解码 发现还是有问题 后来去查阅了相关资料 发现是编解码的问题 gbk
  • CSS——背景(background)和列表(list-style)

    背景 background attachment图片滚动条滚动 div width 300px height 2000px background image url img a31c4997d0d261be5329cf402f6b7ec1
  • 异常数据剔除

    1 在SPSS中做箱型图 图中可以显示异常值 然后剔除 但问题是大数据 采用箱形图已经不显示了 2 拉依达准则法 3 简单 无需查表 测量次数较多或要求不高时用 是最常用的异常值判定与剔除准则 但当测量次数 10次时 该准则失效 如果实验数
  • conda安装opencv

    conda install chttps conda binstar org menpo opencv
  • Cef经典N大问题

    1 cef启动 退出的时候怎么崩溃了 答 如果是启动时崩溃 请看资源目录是否文件都齐全 退出的话见https github com fanfeilong cefutil blob master doc CEF Close md 如果是cen
  • mysql和m_MySQL-----(M-S,和,M-M)

    实验项目 一主多备 双主双备 一 一主多备 1 需要至少两台MySQL 一台主 一台备 在主备上创建数据库 mysql uroot p123 create databse HA use HA create table T1 id int n
  • 详解:字符转换函数(大写转小写,小写转大写)

    对于我们在刚刚学习C语言的时候的练习题 不知道大家还能记得多少 多组输入 输入一个英文字符 判断 如果是大写 则输出小写 如果是小写 则输出大写 这个题目 其实在刚刚开始学习的时候 为难了笔者老久都没有攻克 主要还是在于 回车键没有抵消 所
  • 使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题

    使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题 Code import os import openai import re def get ai response prompt engine text da
  • react-lazyload懒加载控件源码解析

    简介 本篇文章主要介绍一个优秀的基于react实现的懒加载控件 github com twobin reac 优点 易于使用 比如
  • 基于机器学习的心脏成像诊断

    心脏成像在心血管疾病 CVD 的诊断中起着重要作用 但到目前为止 它的作用仅限于对心脏结构和功能的观察和定量评估 然而 随着大数据和机器学习的出现 人工智能方法的出现将直接帮助临床医生诊断CVD 本文全面回顾了这一领域的最新研究成果 并为读
  • js数组去重常用方法

    js数组去重是面试中经常会碰到的问题 无论是前端还是node js数组常见的有两种形式 一种是数组各元素均为基本数据类型 常见的为数组字符串格式 形如 a b c 一种是数组各元素不定 元素中既有基本数据类型 也有引用数据类型 形式如 na
  • 某书最新版X-s(2023/5/23更新)

    前不久刚写过xhs的x s 前几天听一些小伙伴说又更新了 我二话不说还按原先的逆向思路 直接搜function sign 开始施展补环境大法 一顿无用的折腾 补完后 测试发现死活不成功 这真是离了大谱了 对比了一下 通过补环境 sign生成
  • 【linux】【tar】tar命令详解之czvf,xzvf

    Linux tar 英文全拼 tape archive 命令主要用于文件的打包压缩及解压 命令最初的设计目的是为了将文件备份到磁带上 tapearchive 因而得名tar 1 常用tar命令实例 打包命令 tar czvf xxx 说明
  • 代码布局优化

    代码布局优化是编译技术中的一种策略 其目的是调整程序中函数和数据的物理布局 以提高程序的执行速度 更好的代码布局能够有效利用现代处理器的特性 例如指令缓存和分支预测 从而提高性能 以下是代码布局优化的几个关键方面 指令缓存效率 当处理器执行
  • linux系统支持ntfs吗,Linux支持NTFS格式文件的方法

    一般情况下Linux系统是不支持NTFS文件系统的 所以我们不能在Linux系统中挂载NTFS文件系统类型的硬盘或移动硬盘 那么我们如何才能让Linux系统支持NTFS文件系统呢 现在我们去看看Linux支持NTFS格式文件的方法介绍 Li
  • VS 2022(Visual Studio 2022)菜单栏中增加文件-高级保存选项

    背景 最近想使用VS工具来开发Qt项目 但运行后发现程序运行中文会显示乱码 在网上找了相关资料后需要使用高级保存选项来更改文件编码为UTF 8类型 但VS2022貌似没有高级保存选项 摸索一番后发现添加该选项的方法 故而分享一下 参考连接
  • iwebsec靶场 文件包含漏洞通关笔记8-php://input伪协议利用

    目录 前言 1 php input伪协议原理 2 php input伪协议使用条件 第08关 php input伪协议利用 1 打开靶场 2 源码分析 3 伪协议渗透获取php信息 1 构造post信息 2 渗透 4 伪协议获取目录信息 1
  • 基础指针【指针的基本使用方法和注意事项】

    基础指针目录 前言 指针 指针是什么 指针的大小 指针的定义和赋值 指针的使用 传值调用和传址调用 传值调用 传址调用 指针的弊端 野指针 使用指针的注意事项 前言 指针 是我们在学习C语言中的一个重难点 关乎到我们学习C语言的深度和理解