c语言初阶指针

目录

何为指针

地址大小

野指针

成因 

 如何规避

 有效性

指针计算

+-整数

​编辑

 指针比较运算

指针-指针

​编辑 数组与指针关系

二级指针

指针数组

应用 


何为指针

指针就是指针变量,用来存放内存空间的一个编号,将指针比作我们宾馆的客人,内存空间就是一个个的房间,每一个指针变量对应一个地址空间。

int a = 0;
int *pa = &a;

 pa记录了a的地址int除了代表指向数据的类型,还可以表示访问字节的能力

内存单元的单位是字节,而每个内存单元都有自己唯一的编号,而指针指向的是首元素第一个字节的地址,当我们 对指针进行加减操作时,也是按照数据所占的字节数来向前向后偏移的。

也就是说char类型指针加一跳过一个字节,int类型指针加一跳过四个字节.......

地址大小

x86

x64 

野指针

定义:指向未定义的空间(随机的、不正确、没有明确限制的

成因 

1.指针未初始化 

	int* p;//p就是野指针*p = 20;

2.越界访问

	int arr[10] = {0};int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (i = 0; i <= sz; i++){*p = i;p++;}

对数组越界访问未初始化的空间,出现了野指针。 

3.指向空间释放

int* test()
{int num = 100;return &num;
}int main()
{int* p = test();*p = 200;return 0;
}

函数销毁后通过指针接收归还给内存空间的地址,并对其进行修改,这也是一种典型的野指针。

 如何规避

  • 指针初始化(可初始化为NULL)
  • 小心指针越界
  • 指向空间释放(free)时,及时置NULL
  • 避免返回局部变量(栈空间)的地址
  • 指针使用前检查有效性

 有效性

	int* p = NULL;if (p != NULL)//不为空再使用{printf("%d\n", *p);}

指针计算

+-整数

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,

指针接收一个数组实际接收的是它首元素的地址,数组名等价于首元素地址,通过+-整数来实现向前向后的一个偏移,偏移量为该类型所占内存大小。

 指针比较运算

    #define N_VALUES 5   float arr[N_VALUES];float* vp;for (vp = arr; vp < &arr[N_VALUES];)//从前往后{*vp++ = 0;//++优先级高}

修改(不推荐): 

#define N_VALUES 5   
float arr[N_VALUES];
float* vp;
for (vp = &arr[N_VALUES-1]; vp >= &arr[N_VALUES];vp--)//从后往前{*vp = 0;}

第一种方案是与数组后面的指针进行比较,然后依次赋值,第二种方案是从后往前比较,在完成首元素赋值后对前一个地址进行比较不符合条件退出循环。

 

规定:允许指向数组元素的指针与指向数组最后一个元素后面的内存空间比较大小,不允许与指向数组首元素前的内存空间比较。所以前者是规范写法。

指针-指针

两个指针的相减不是简单的内存编号相减,而是指向同一块连续空间同类型指针(地址)相减,所得结果为二者相差的元素个数(偏移量)

我们可以在模拟实现strlen函数的时候利用这点得到字符的个数: 

 数组与指针关系

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);/*for (i = 0; i < sz; i++){printf("%d ", *p);p++;}*/for (i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}

        观察上面的代码,发现数组和指针就是一个模子刻出来的一样,实际上它们是有区别的。

        不同:数组是一块连续的空间,用于存放各种数据,它的大小取决于元素个数,而指针是一个变量,用于存放地址,大小为4\8字节。

        联系:数组名是地址(指针),数组把首元素地址交给指针后,可以用指针来管理数组。

二级指针

和一级指针一样,二级指针也是用于存放地址,它存放的是一级指针的地址。 

 

蓝色圆圈代表指针存放地址的那个变量的数据类型,*p代表了指针。如果想通过它访问a的值,只需进行两次解引用即可。

指针数组

顾名思义,存放指针的数组就叫做指针数组。

int* arr3[5];//存放整型指针的数组
char* arr4[6];//存放字符指针的数组

应用 

 我们可以用多个一维数组模拟二维数组来使用指针数组。

这里我们成功模拟出了二维数组,但它和实际的二维数组还是有些差别,比如二维数组是连续的空间,而指针数组的每个元素是不连续的,但毕竟是模拟,目的是为了了解指针数组的具体功能。

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

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

相关文章

java基础(三)

101.如何让写出去的数据能成功生效? flush()刷新数据 close()方法是关闭流&#xff0c;关闭包含刷新&#xff0c;关闭后流不可以继续使用了。 102.学会字节流完成文件的复制&#xff08;支持一切的文件&#xff09; public class CopyDemo05 { public static void main(St…

css transition属性

如果想实现一些效果&#xff1a;比如一个div容器宽高拉伸效果&#xff0c;或者一些好看的有过渡的效果可以使用 定义和用法 transition 属性是一个简写属性&#xff0c;用于设置四个过渡属性&#xff1a; transition-property transition-duration transition-timing-func…

sqlserver 各种集合、区间、 时间轴(持更)

1.所有有交集的区间 场景&#xff1a;在事件表里查找某年员工的岗位系数&#xff0c;并计算其加权平均数。case1&#xff1a;该员工是老员工&#xff0c;从2020年一直到2049年。case2&#xff1a;该员工是老员工&#xff0c;但是今年离职。case3&#xff1a;该员工是今年的新员…

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现。通过共享视图模型&#xff08;View Models&#xff09;和共享 UI 状态&#xff08;UI States&#xff09;&#xff0c;我们可以专注于在原生端…

网络编程day5作业

1. 根据select TCP服务器流程图编写服务器&#xff08;上交&#xff09; #include <myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0) #define PORT 6666 #define IP "192.168.114.50" int main(in…

内网渗透之凭据收集的各种方式

凭据收集是什么&#xff1f; 凭据收集是获取用户和系统凭据访问权限的术语。 这是一种查找或窃取存储的凭据的技术&#xff0c;包括网络嗅探&#xff0c;攻击者可以在网络嗅探中捕获传输的凭据。 凭证可以有多种不同的形式&#xff0c;例如&#xff1a; 帐户详细信息&#xf…

ESXI主机扩容(VCSA)

原因分析SCSI扩容 VMware为ESXI虚拟机硬盘扩容(需要先关闭ESXI) ESXI扩容前ESXI扩容 https://blog.csdn.net/tongxin_tongmeng/article/details/132652423 ESXI扩容后

2023年8大在线渗透测试工具介绍与分析

随着企业参与数字化运动&#xff0c;网络安全已成为大多数董事会讨论的一个重要方面。事实上&#xff0c;最近的一份报告显示&#xff0c;2022 年网络犯罪造成的损失总额达到惊人的 103 亿美元。 这就是在线渗透测试工具在网络安全中受到关注的地方。 今天&#xff0c;我们希…

安卓核心板的不同核心规格及架构介绍

安卓核心板是将核心功能封装的一块电子主板&#xff0c;集成芯片、存储器和功放器件等&#xff0c;并提供标准接口的芯片。 其特点&#xff1a; ● 能跑 Android 等操作系统 强大的功能及丰富的接口 支持 LCD/TP&#xff0c;Audio&#xff0c;Camera&#xff0c;Video&#…

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

Docker部署(5)——使用docker run命令部署运行jar项目

对于一些简单的单体项目&#xff0c;可以使用 docker run 命令可以直接在命令行中运行容器&#xff0c;无需事先构建镜像。这相较于之前使用的 dockerfile 文件来运行部署项目相当于是另外一种简单的部署方法&#xff0c;关于之前使用dockerfile 文件来运行部署这种方法&#x…

uView实现全屏选项卡

// 直接复制粘贴即可使用 <template><view><view class"tabsBox"><u-tabs-swiper ref"uTabs" :list"list":current"current"change"tabsChange":is-scroll"false"></u-tabs-swiper&g…