对c语言中的指针进行深入全面的解析

news2024/11/16 3:35:17

1.普通的指针:

实际上指针就是存放地址的变量,eg:

int a=10;

int *p=&a;

拆分一下int *中的*说明p是一个指针,int是它所指向的类型;


2.字符串指针和字符串数组

char*str1="abcd";

先看这一个,这个就是一个字符串指针,它是一个常量指针,在c中才能这么定义,如果是cpp中,

它会强制要求你用 const char* str1="abcd";

这个指针是让"abcd"这个字符串的地址赋予给了str1,而它们的地址是处于静态内存区的,你是无法进行修改的。

字符串数组,eg

char str[20]="abcd";

这个就是生成了一个空间用于存放这个字符串,这个空间中的内容是可以修改的,所以一般的str函数操作的字符串都是在操作这一个。


3.指针与数组相互联系:

int arr[10]={0};

int *p=arr; 

这里的arr指的是arr数组的首元素的地址 既为arr[0]的地址;

&arr则指的是整个数组,让我们验证一下这件事:

从16进制的转换可以得知,这里跳过了40个字节,也就是10个int,说明&arr确实指向的是arr这整一个数组;说到这里,让我们拓展一下,sizeof中出现arr时,代表的也是整一个数组,

             int sz = sizeof(arr) / sizeof(arr[0]);

所以我们总是会使用这种方式去求取整型数组中元素的个数;总结一下:

只有在sizeof(arr)和&arr时arr代表的是整个数组,否则都是数组首元素的地址;

这个在二维数组也是成立的,让我们来证明这件事。eg:

1:

跳过了20个字节,也就是5个int;

2:

int arr[3][5]={0};

int (*pf)[5]=arr;这里需要使用(数组指针才能够接受它的地址)


4.数组指针,指针数组等的讲解

char* arr[10]={0};

这个就是一个指针数组(也就是存放指针的数组),char* 代表了是一个char类型的指针,[10]说明了是一个数组;为什么不是数组指针呢?因为数组指针是长这样的 char (*arr)[10](一般是用于处理二维数组比较常用);上面那个是先跟数组组合的,说明是一个数组。

这里附上指针数组使用的例子,数组指针容易错误使用的例子和正确使用的例子。

1.指针数组的使用例子

打印的那个也可以换成arr[j][i]也没有关系,相当于模拟了一个二维数组的效果;

2.数组指针的错误使用

3.数组指针的正确使用例子


5.函数指针

5.1简单介绍

void add(int a,int b){

return a+b;

}

int (*pf)(int a, int b)=add;

这里相当于定义了一个函数指针,让add函数的首地址赋值给了pf,(*pf)()这个格式说明了是一个函数指针,但是有一点要注意的就是在调用的时候,可以不用解引用符号,pf(2,3)即可,为什么呢?因为你没发现函数在调用的时候也是add(2,3)吗,但是如果为了思维上更严谨,你当然也可以加

既 (*pf)(2,3)注意要用括号;

5.2函数指针在函数声明方面的引用

void (*(*pf)(int a,void (*)(int a)))(int a)

这个是个函数指针,怎么看呢?

A=(*pf)(int a,void (*)(int a))

首先把 void(*A)()

这样你是不是就看出来了呢

 怎么理解这件事情呢?请看下面

typedef void(*)(int a) pf_t 这样重命名是错误的,要用下面的方式

typedef void(*pf_t)(int a); 既把void(*)(int a) 简化为pf_t

pf_t (pf(int a,pf_t)

与 int add(int a, int b)这样的函数声明是不是就能联系上了呢?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振弦式渗压计智慧水利工程 适用恶劣环境有保障

产品概述 振弦式渗压计适合埋设在水工建筑物和基岩内,或安装在测压管、钻孔、堤坝、管道或压力容器中,以测量孔隙水压力或液位。主要部件均采用特殊钢材制造,适合在各种恶劣环境中使用。特殊的稳定补偿技术使传感器具有极小的温度补偿系数。…

量产AI美女?一文讲清“数字尤物”背后的AI绘画的商机

这些AI美女都有刷到过吧?从国外Youtube的视频封面图的丰满hotgirl,到小红书笔记各式风格数字尤物,都已悄咪咪混入我们的社交媒体,而且“她们”的伪装技能越发满级! 更多实操教程和AI绘画工具,可以扫描下方,免费获取 本…

(undone) 声音信号处理基础知识(10) (Demystifying the Fourier Transform: The Intuition)

参考:https://www.youtube.com/watch?vXQ45IgG6rJ4 FT 可以把时域信息转为频域信息 以下是对于 FT 的一些 intuition-level 的理解: 1.FT 会把原始信号跟不同频率的一系列正弦波对比 2.对于每一个正弦波频率,我们会得到一个标量 和 一个相…

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作(quick asset action) 自定义编辑器功能 0.创建编辑器button,测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class,derived from AssetAction…

Vue中nextTick的底层原理

Vue中nextTick的底层原理 前言一、异步更新队列二、前置知识2.1 JS 运行机制2.2 异步任务的类型 三、nextTick 实现原理3.1 Vue.nextTick 内部逻辑3.2 vm.$nextTick 内部逻辑3.3 源码解读3.4 为什么优先使用微任务: 前言 知其然且知其所以然,Vue 作为目…

UWB为什么是首选的室内定位技术

超宽带 (UWB) 是一种基于 IEEE 802.15.4a 和 802.15.4z 标准的无线通信技术,能够非常准确地测量无线电信号的飞行时间,从而实现厘米级精度的距离/位置测量。 除了这一独特功能外,UWB 还提供数据通信能力,且功耗极低,使…

【包教包会】CocosCreator3.x框架——音频模块(无需导入、无需常驻节点)

下载地址:AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项: 1、gi.musicPlay、gi.soundPlay是同步函数,使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面,将音频全部加载后进入游戏&…

【Qt笔记】QStackedWidget控件详解

目录 引言 一、基础功能 二、属性设置 2.1 属性介绍 2.2 代码示例 2.3 代码解析 三、常用API 3.1 添加子部件 3.2 插入子部件 3.3 移除子部件 3.4 设置当前页面索引值 3.5 设置当前显示子部件 3.6 返回索引处子部件指针 3.7 返回子部件索引值 四、信号与槽 4.…

device靶机详解

靶机下载地址 https://www.vulnhub.com/entry/unknowndevice64-1,293/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.159 nmap -sS -Pn -A -p- -n 192.168.229.159 这段代码使用nmap工具对目标主机进行了端口扫描和服务探测。 -sS:使用…

C++存储数据单位转换输出字符串

C封装存储数据单位转换, 方便将输入数据以指定方式输出 main.cpp #include <wtypesbase.h> #include <string> #include <vector> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 数…

typename、非类型模板参数、模板参数的特化、模板类成员函数声明和定义分离、继承等的介绍

文章目录 前言一、typename二、非类型模板参数三、模板参数的特化1. 函数模板参数的特化2. 类模板的特化 四、模板类成员函数声明和定义分离1. 显示实例化&#xff08;不建议使用&#xff09;2. 将生命和定义写在同一个.h文件中 五、 继承总结 前言 typename、非类型模板参数、…

解析rss链接数据,来长期把某博客数据订阅到自己的网站

目的 当我们打开这个订阅链接&#xff0c;会看到我们的文章信息以xml的形式呈现到浏览器页面中&#xff0c;怎么直接在我们自己的网站中&#xff0c;将这个链接的数据转为我们熟悉的json数据&#xff0c;然后渲染到自己的网站中呢 技术栈 react hookstypescriptwebpack 核心…

【SemeDrive】【X9HP】【PTG4.3】解决Partition Flash Error及PTG4.3二级分区烧录与升级问题

前言&#xff1a;PTG4.1 之前的版本使用的都是普通 emmc 和 一级分区表&#xff0c;PTG4.3 新增了 virtio-eMMC 功能和二级分区表的设置&#xff0c;因此关于 PTG4.3 的烧录和升级有以下几个疑问和解答。 一、名词解释 virtio-eMMC&#xff1a;基于 Virtio 框架的虚拟化 EMMC…

如何在 Apache 中仅开启 TLS 1.3 / TLS1.2 ?

互联网之所以运行良好&#xff0c;是因为它可以安全地发送数据&#xff0c;这要归功于传输层安全(TLS)等技术。TLS 是安全套接字层(SSL)的新版本&#xff0c;它有助于保持网络流量的安全。本文将讨论 TLS 1.3 和 1.2&#xff0c;它们比旧版本更好、更快。 使用这些协议的一个流…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储&#xff1a;结点在存储器中的位置是任意的&#xff0c;即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成&#xff0c;即数据域(data)和指针域&#xff0c;数据域是用于存放数据的&…

目标检测——VOC2007数据集

目标检测入门code 文件目录 下载数据集——在官网下载VOC2007数据集 下载训练数据集 TRAIN data 下载测试数据集 TEST data 解压数据集 解压——训练数据集&#xff0c;在服务器上&#xff0c;目录为VOCdevkit 部分文件目录 全部文件总目录 解压——测试数据集 &#xff08;…

Python画笔案例-061 绘制万花筒

1、绘制万花筒 通过 python 的turtle 库绘制 万花筒,如下图: 2、实现代码 绘制 万花筒,以下为实现代码: """万花筒.py本程序需要coloradd模块支持,安装方法:pip install coloradd技术支持微信scartch8,QQ:406273900""" import turtle from…

桌球计时计费系统计费方式有哪些 哪个好用 佳易王台球计时计费管理系统操作教程

一、前言 桌球计时计费系统计费方式有哪些 哪个好用 佳易王台球计时计费管理系统操作教程 1、佳易王桌球计时计费软件&#xff0c;可以多种单价计费方式&#xff0c;具体使用哪种计费方式可以根据自己的情况设置即可。 2、软件已内置数据库不需再安装&#xff0c;解压即可。 …

奇瑞汽车—经纬恒润 供应链技术共创交流日 成功举办

2024年9月12日&#xff0c;奇瑞汽车—经纬恒润技术交流日在安徽省芜湖市奇瑞总部成功举办。此次盛会标志着经纬恒润与奇瑞汽车再次携手&#xff0c;深入探索汽车智能化新技术的前沿趋势&#xff0c;共同开启面向未来的价值服务与产品新篇章。 面对全球汽车智能化浪潮与产业变革…

MovieLife 电影生活

MovieLife 电影生活 今天看到一个很有意思的项目&#xff1a;https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常&#xff0c;这类想法只是一闪而过&#xff0c;很少会付诸实践。但这次有所不同。假如你的生活是一部电影&#xff0c…