指针进阶(1)(字符指针,指针数组,数组指针,函数指针)

news2024/9/22 1:27:10

目录

前言:

字符指针

TIP:

指针数组

数组指针

概念辨析

形式辨析

数组名的理解:

数组指针如何使用?

 二维数组的传参

函数指针

函数的地址:

函数指针的形式

函数指针的作用

 关于函数指针一些奇特的点


前言:

本文主要讲解指针进阶部分的内容,分为字符指针,指针数组,数组指针,函数指针。

字符指针

我们不仅要知道

char c = 'w';
char *p = &c;

这种最基础的字符指针,也要知道下面这种字符指针:

int main()
{
	const char* p = "abcdef";//把字符串首元素的地址赋给p
	printf("%s\n", p);//给%s必须是地址
	printf("%c\n", *p);
	return 0;
}

输出结果:

 我们不难发现p存储的是字符串的首元素地址,这也是一种比较常见的字符串初始化方式,所以此时的p就是一个字符指针,存储的是字符串首元素地址

TIP:

因为此时的字符串是一个常量字符串,所以修饰指针p最好要有const,并且在*左边。

指针数组

指针数组的主语是数组,顾名思义就是存放指针的数组。 

int *arr[5];//存放整型地址的指针数组
char *arr[6];//存放字符类型的指针数组

数组指针

概念辨析

我们类比一下:

整型指针:指向整型变量的指针,存放整型变量的地址的指针。

数组指针:指向数组的指针,存放数组地址的指针。

形式辨析

int * p;

首先*表示这是一个指针,命名为p,然后指向的是int类型的指针,数组指针也一样

int(*p) [5];

上面的形式就是数组指针,我们需要先用()把*和指针名括起来,然后剩下的就是指针指向的类型,也就是int [5],即数组。

数组名的理解:

数组名表示首元素的地址,有两个例外

1、sizeof(数组名),这里的数组名不是数组首元素的地址,数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节

2、&数组名,这里的数组名表示整个数组的地址,&数组名取出的是整个数组的地址

除此之外,其余地方出现的数组名都表示首元素的地址

数组指针如何使用?

数组指针一般和二维数组联动。

因为数组指针存放的是一整个数组的地址,而二维数组传参,二维数组的数组名就表示这个二维数组首行的地址(注意是首行的地址!)

下面是利用数组指针来遍历二维数组

void print(int(*p)[5], int r, int c)
{
	for (int i=0;i<r;i++)
	{
		for (int j=0;j<c;j++)
		{
			printf("%d ", *(*(p + i) + j));//数组指针的运用
		}
		printf("\n");
	}
}


int main()
{
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	print(arr, 3, 5);//二维数组传参表示二维数组第一行的地址
	return 0;
}

 二维数组的传参

形参接收分为数组接收和指针接收。

数组接受时,行可以省略,但是列不能

指针接收,必须用数组指针来接收。

函数指针

函数指针就是指向函数的指针。

函数的地址:

没错,函数也是有地址的,并且&Add,和Add本身都是一样的

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	printf("%p\n", Add);
	printf("%p\n", &Add);

	return 0;
  }

可见,两者地址是一样的 

函数指针的形式

与数组指针的形式非常相似

先用括号括起来,然后后面的圆括号表示函数的参数类型,最后前面的int表示函数的返回类型。

函数指针的作用

我们可以用函数指针来调用函数本身(由函数的地址找到函数去调用它)

 关于函数指针重命名

我们来辨析这一段代码,首先signal是一个名字,后面跟了圆括号,说明它是一个函数名,并且函数的参数分别是int,void(*)(int),函数应该还有函数的返回类型,此时把前面的signal和两个参数全部去掉,发现剩下void(*)(int),这就是函数的返回类型!

我们这样写代码,使得代码的可读性太低,我们想到之前的类型重命名typedef

但是运用到函数指针时比较特殊,必须把重命名的内容放在(*)里面,与*相连

//typedef void(*)(int) p;
//上面的重命名方式是错的

typedef void(*p)(int);//正确!

int main()
{
	void(*signal(int, void(*)(int)))(int);
	p signal(int, p);
	return 0;
}

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

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

相关文章

Java基础知识 之 java Applet 小训练

import java.applet.Applet; import java.awt.*; import java.util.Random;import static java.lang.Math.cos; import static java.lang.Math.sin;public class HelloWorldApplet extends Applet {public void paint(Graphics g) {// 将Graphics对象转换为Graphics2D类型java.…

Linux 系统编辑 --文件IO

目录 1.文件 IO 1.1系统调用 1.2 C 标准库文件 IO 函数 1.3 open/close 函数 1.4 文件描述符表 1.7 read/write 函数 1.8 缓冲区 1.9 错误处理函数 2.0 阻塞、非阻塞 2.1 lseek 函数 辅助学习资料 参考书 1 &#xff1a;《 Unix 环境高级编程》 W.Richard St…

MFC学习日记(二)——VS2012应用程序工程中文件的组成结构

上一篇我们用应用程序向导生成框架程序后&#xff0c;我们可以打开工程所在的文件夹看到以下以解决方案命名的文件夹&#xff0c;此文件夹中包含了几个文件和一个以工程名命名的子文件夹&#xff0c;这个子文件夹中又包含了若干个文件和一个res文件夹&#xff0c;创建工程时的选…

Vue2:axios解决跨域的问题(vue2没有config情况下)

在vue2上用axios发起Post模拟注册的时候&#xff0c;调用接口&#xff0c;提示报错&#xff1a; axios({method: post,url: http://1.12.254.80:8080/api/user/register,// url: /user/api/user/register,data: { // 请求体数据userAccount: userName,userPassword: pwd1,check…

离线环境下安装微软Visual Studio 2022 生成工具

1. 前言 最近&#xff0c;在学习cython的时候&#xff0c;需要安装windows下的C/C编译、链接工具。开始觉得传统的msvc太大了&#xff0c;想要尝试Mingw&#xff0c;但是都是编译错误。无奈之下&#xff0c;还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools &…

MySQl数据库第五课 --------在SQl的简单命令--------学习学习

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————— 目录 数据库的简单介绍 1.数据储存 2.数据库类型 &#xff08;1&#xff09;.关系型数据库 &#xff08;2&#xff09;.非关系型数据库…

大学英语六级相当于雅思考试多少分

雅思考试的难度&#xff0c;可以和大学英语六级进行对应&#xff0c;大家可以通过分数来基本确认雅思考试的难度系数。跟着小编来一起看看大学英语六级相当于雅思考试多少分&#xff1f; 英语六级相当于雅思多少分 大学英语六级和雅思没有直接的分数对应关系&#xff0c;一般大…

部署LVS+Keepalived高可用集群

目录 一、keepalived概述 1.1管理LVS负载均衡软件 1.2VRRP(Virtual Router Redundancy Protocol) 原理 二、keepalived服务的重要功能 2.1自动切换&#xff08;failover&#xff09; 2.2健康检查&#xff08;health checking&#xff09; 2.3高可用&#xff08;HA&#x…

深度神经网络剪枝算法基础理论

非结构化剪枝可获得更高的剪枝率与精度&#xff0c;但是其非结构化特征带来的随机连接使得往往需要专门的软、硬件设计来支持其推理加速&#xff0c;而在现有的边缘硬件上难以满足其应用条件。鉴于此&#xff0c;目前在剪枝领域的研究多集中在结构化剪枝上&#xff0c;如图1.11…

RabbitMQ系列(22)--RabbitMQ优先级队列

前言&#xff1a;在购物系统中有一个订单催付的场景&#xff0c;如果客户在购物系统下单后在设定的时间内未付款那么就会给客户推送一条短信提醒&#xff0c;这是一个比较简单的功能&#xff0c;但是&#xff0c;商家对我们来说&#xff0c;肯定是要区分大客户和小客户的&#…

Xshell7/Xftp7 解决强制更新问题:要继续使用此程序,您必须应用最新的更新或使用最新版本

文章目录 一、背景二、解决方案方案一&#xff1a;重新安装&#xff08;推荐&#xff09;方案二&#xff1a;修改nslicense.dll文件&#xff08;不推荐&#xff09;方案三&#xff1a;修改系统时间&#xff08;可选&#xff09;Xshell.batXftp.bat 三、总结 一、背景 Xshell7/…

音频编码流程 ----- PCM编码为AAC格式

文章目录 1.音频编码流程2.编码函数API含义解释3.音频编码实战Demo PCM转AAC格式 1.音频编码流程 2.编码函数API含义解释 av_frame_make_writable 确保帧数据可写&#xff0c;尽可能避免数据复制.如果帧可写&#xff0c;则不执行任何操作&#xff0c;如果不可写&#xff0c;则…

ssm整合shiro安全框架 前后端分离项目

上一篇文章我们使用ssm整合了shiro安全框架前后端没有进行分离 本篇文章在上一章的项目基础上进行前后端代码分离操作 一、根据账号和密码登录后前后端代码分离&#x1f349; (1)定义一个统一的json类 统一返回的格式&#x1f95d; package com.lzq.vo;import lombok.AllArg…

免费开源 | 基于SpringBoot的博客系统

介绍 基于springboot后端架构&#xff0c;websocket实现私信&#xff0c;前端采用thymeleafbootstraplayuiRedis 注册使用邮箱验证注册&#xff0c;且验证码存在redis中&#xff0c;所以需要有redis环境 软件架构 springbootwebsocketthymeleafbootstraplayuiRedismysql 8.…

设计模式--代理设计模式

&#x1f389;&#x1f389;&#x1f389;写在前面&#xff1a; 博主主页&#xff1a;&#x1f339;&#x1f339;&#x1f339;戳一戳&#xff0c;欢迎大佬指点&#xff01; 目标梦想&#xff1a;进大厂&#xff0c;立志成为一个牛掰的Java程序猿&#xff0c;虽然现在还是一个…

C++之std::function和lambda表达式回调函数(一百五十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

新版本FasterTransformer的FUSED_MHA

关于 UNFUSED_PADDED_MHA VS FUSED_MHA FUSED_MHA用了另一种kernel的执行方法(和添加链接描述相同,将在下一个section说明)UNFUSED_PADDED 的 KERNELS执行代码在 src/fastertransformer/kernels/unfused_attention_kernels.cu enum class AttentionType {UNFUSED_MHA,UNFUSED…

C#,中国福利彩票《刮刮乐》的数学算法(01)——幸运123

彩票名称&#xff1a;幸运123面值&#xff1a;20元/张最高奖&#xff1a;100万&#xff08;人民币&#xff09;全套款式&#xff1a;2款玩法介绍&#xff1a; 一份好运&#xff0c;二倍快乐&#xff0c;三重惊喜。福彩刮刮乐新游戏“幸运123”&#xff0c;红色的票面上点缀着礼…

基于simulink使用同步图像跟踪白板上的标记(附源码)

一、前言 此示例演示如何使用Simulink基于图像跟踪白板上的标记。 二、模型 示例模型包含模型引用层次结构。每个模型都有助于图像处理算法。 ex_tracking_marker- 跟踪输入视频中的标记的顶级模型。此模型使用视频查看器块呈现输出视频&#xff0c;并将输出帧记录在工作区变…

Unity桌面弹球小游戏Finger Soccer Game Kit 1.1

按住鼠标左键发射打球 还可以开启双人模式来玩 地址&#xff1a;https://download.csdn.net/download/Highning0007/88020441