关于C语言指针类型的总结

news/2024/10/24 23:10:15/文章来源:https://www.cnblogs.com/bz-crab/p/18501539

前言

我个人将目前在C语言中所遇到的指针归类为8种,至于为何写第九点,是因为我个人认为第九点极容易与第五点混淆,故总结如下:

1.普通指针

普通指针即最常见的如:int * 、 char*等

甚至于也可将一个数组如arr[5]的数组名arr看作是指针类型(因为指针本质上就是地址,而arr 是该数组首元素的地址)

但是值得注意的是 sizeof (arr) 与&arr两种情况所代表的是整个数组的地址,首元素地址和整个数组地址在值上虽然相同,但在各自+1、-1操作所跨越的空间极为悬殊,前者+1只跳过一个元素,后者+1则是跳过整个数组。

2.野指针

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

以下介绍几种野指针情况

①指针未初始化

#include <stdio.h>
int main()
{        int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

②指针越界访问

 #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;

③指针指向的空间释放

 #include <stdio.h>int* test(){int n = 100;return &n;}int main(){int*p = test();printf("%d\n", *p);return 0;}

出函数的时候变量n申请的空间会归还给操作系统
存在p中的地址没有指向的空间

3.无符号型指针(泛型指针)

无符号型指针即void * 型

void*可以用来接收任何类型的地址,这是其优点,但需要注意的是

void*类型的指针不能直接进行指针的+-整数的运算。

注:一般void*指针使用在函数参数部分,使得一个函数可以处理多种类型的数据,以实现泛型编 程的效果。

#include <stdio.h>
int main()
{int a = 10;void* pa = &a;void* pc = &a;*pa = 10;*pc = 0;return 0;
}

这里我们可以看到, void* 类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

4.二级指针

二级指针概念:存放一级指针地址的指针(本质上还是地址)

5bae1b6ecbe148a592835f38e1c12ab2.png bd855b8482154f0fafef103c3fecd5c6.png

至于是跳过4个还是8个字节取决于当前是几位的操作系统。

5.数组指针

数组指针概念:存放的是数组的地址,是能够指向数组的指针变量。

f65e6775e98d4d648dda6e85708869c5.png

上图p2就是数组指针变量,详细分析可见第8点。

数组指针的初始化:int(*p)[10] = &arr;

6.函数指针

函数指针概念:函数指针变量是⽤来存放函数地址的

函数名就是函数的地址,当然也可以通过 &函数名获得函数的地址,两者等价。**

bb01bd7ac33c480c9a2b187c6b9878ef.png

7.结构体指针

struct Test
{ int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
2956534ec03e4f1e8e3acd36e1732c10.png

如图:P就是结构体指针变量(指向结构体)

注:p+1跳过的是一个结构体的大小。

8.文件指针

FILE pf; // 文件指针变量**

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。

即通过文件指针变量能够间接找到与它关联的文件。

至于FILE类型数据解释如下:

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息。

⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

img

9.指针数组(是数组而非指针)

对于指针数组的理解可以参考整型数组和字符型数组

如下图

b3aa411561354eae95dd6e662165db8f.png a4d99ce34dd548b7af5f0977e0ad6784.png

*在这里有必要将指针数组与数组指针对比一下*

261395204986435db4afe421eb53689c.png

分析:p1优先与[10]结合,p1是数组名,即1式是指针数组。

p2优先与*结合,表明p2是指针变量,即2式是数组指针。

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

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

相关文章

ClickHouse的下载与安装部署

ClickHouse 安装 一、了解ClickHouse ClickHouse是一个关系型数据库,说到关系型数据库,我们之前也学习到一个数据库Mysql,但是两者之间是有着很大区别的。MySQL数据库一般存储较少的数据(100万以内),而今天学习的ClickHouse存储的数据就相当之大,可以存储亿条数据。再者…

淘宝天猫卖家电话采集软件下载地址

淘宝天猫卖家电话采集软件下载地址 采集淘宝天猫店铺电话是一个相对复杂且敏感的任务,因为淘宝和天猫平台通常不允许直接大规模采集店铺数据,这涉及到隐私保护和平台规则的问题。然而,我可以提供一些合法且合规的方法来获取店铺联系方式,并给出一个简化的代码示例来说明如何…

帝国cms后台忘记了安全提问及密码该如何找回?

| 找回项目 | 方法 | |------------------|--------------------------------------------------------------------| | 忘记后台管理员帐号 | 用phpmyadmin查看`phome_enewsuser`表里的记录:查…

CTF Week8 WP

作业管理系统 简单的PHP上传,传一个带shell的php文件就可以了.示例文件 <?php echo shell_exec("ls /"); echo shell_exec("cat /flag"); phpinfo(); ?>来源:题库LocalCat 验证是否为本地用户,在请求头部添加X-Forwarded-for: 127.0.0.1即可.来…

忘记EyouCMS后台密码解决办法

如果你忘记了EyouCMS的后台登录密码,可以通过以下步骤快速重置: 1. 准备重置文件下载附件:从可信来源下载重置密码的脚本文件setpwd.php。 解压文件:将下载的压缩包解压,得到setpwd.php文件。2. 上传文件上传文件:将setpwd.php文件上传到你的网站根目录。通常,网站根目录…

如何评估项目进度的风险和不确定性

项目进度的风险和不确定性是项目管理中的关键方面,其评估可以通过多种方法和工具来进行。关键步骤包括识别潜在风险因素、进行定性和定量的风险分析、制定应对策略,以及定期监控和调整风险管理计划。其中,制定应对策略是风险评估中至关重要的一步,它涉及根据风险分析的结果…

wireshark学习笔记

wireshark学习笔记 从一道面试题开始A ping B 理论分析注意:通过MAC判断--1单播,2组播,3广播, 手动修改MAC时不允许修改成组播或广播。 十六进制0x0b转为二进制时为11A需要判断B是否和它是一个网段 A通过自己的掩码判断自己的网段是192.168.26.0/24,用自己的掩码与B主机的…

免费的erp系统有哪些

在市场上,有一些免费的ERP系统,它们提供了成本效益高、功能齐全的解决方案。这些系统包括:1. Odoo;2.Dolibarr;3.ERPNext;4.xTuple PostBooks;5.FrontAccounting;6.Apache OFBiz;7.Metasfresh。Odoo是一个全面的开源ERP解决方案,适用于中小型企业,尤其是那些需要高度…

扩展KMP

前言 扩展KMP又称Z函数,可以快速的求出一个字符串的每一个后缀的与其的LCP(最大公共前缀)长度。 至于为什么要学习exKMP,因为(数据规模很上进)我们都是上进的OIer。 算法思路 暴力朴素的算法 将\(n\)个字符的字符串S中第\(i\)位开始的后缀与S的开头一一比较,求出LCP数组…

运算

模二加(异或)运算模 即取余 模运算 当两个整数 a 和 b 模 n 同余,记作 a≡b(mod n),意味着 a 和 b 被 n 除后余数相同。 基本性质:封闭性:如果 a≡b(mod n) 且 c≡d(mod n),那么 a+c≡b+d(mod n),以及 a⋅c≡b⋅d(mod n)。 乘法逆元:对于任何整数 a 和正整数 n,存在一…

Knapsack题解

题面下划线:符合单调性 举例:k=3W : 1 2 3 4 5V : 6 5 1 2 4g: 15 11 7 6 4

Win11安装基于WSL2的Ubuntu

详细介绍了Win11安装基于WSL2的Ubuntu的过程。1. 概述 趁着还没有完全忘记,详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WLS2现在被微软开发的比较强大了,还是很值得安装和使用的,笔者就通过WLS2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装…