【C语言进阶】指针的进阶(1)

news2024/9/22 6:40:49

作者:@匿名者Unit
在这里插入图片描述

目录

  • 一.数组指针
      • 1.定义
      • 2.使用
    • 二.数组、指针传参
        • 1.一维数组传参
        • 2.二维数组传参
        • 3.一级指针传参
        • 4.二级指针传参
      • 三.函数指针

一.数组指针

1.定义

数组指针,顾名思义是指向数组的指针,那数组指针是如何定义的呢

int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个
//指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

这就定义了一个指向大小为10的整形数组的指针。

2.使用

接下来我们看看数组指针的具体使用:

void print_arr2(int(*p)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("%d ", (*(p+i))[j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
	print_arr2(arr, 3, 5);
	return 0;
}

如上的传参其实等同

int(*p)[5] = &arr;

所以说arr就等同于p+0(*(p+i))[j] 等同于 p[i][j]

二.数组、指针传参

1.一维数组传参

void test(int arr[])//ok?
{}
void test(int arr[10])//ok?
{}
void test(int* arr)//ok?
{}
void test2(int* arr[20])//ok?
{}
void test2(int** arr)//ok?
{}

int main()
{
	int arr[10] = { 0 };
	int* arr2[20] = { 0 };
	test(arr);
	test2(arr2);
}

arr是一个一维数组通过test传递给函数时,形参可以直接用一维数组接受或者用指针接受,因为数组名代表着数组首元素,指针可以通过首元素地址找到数组所有元素。

2.二维数组传参

void test(int arr[3][5])//ok?
{}
void test(int arr[][])//ok?
{}
void test(int arr[][5])//ok?
{}
void test(int *arr)//ok?
{}
void test(int* arr[5])//ok?
{}
void test(int (*arr)[5])//ok?
{}
void test(int **arr)//ok?
{}
int main()
{
int arr[3][5] = {0};
test(arr);
}

二维数组数组名代表首元素地址,也就是第一行数组的地址,可以用二维数组直接作为形参接受,但是二维数组不可以省略列可以省略行。也可以使用数组指针 接受。

3.一级指针传参

当一个函数的参数部分为一级指针的时候,函数能接收什么参数?

  1. 变量的地址
  2. 一级指针
  3. 一维数组名

4.二级指针传参

当函数的参数为二级指针的时候,可以接收什么参数?

  1. 二级指针
  2. 一级指针的地址
  3. 指针数组名

三.函数指针

函数也有地址,可以对函数进行取地址操作。
在这里插入图片描述

函数指针就是存放函数地址的一种指针。

接下来我们看两段代码 来理解函数指针:

//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);

代码1其实是一次函数调用(函数名参数
将0作为一个地址,强制转换为void(*)()的函数指针,再调用。


代码2则更好理解,signal函数有两个参数:int和void(*)(int)的函数指针类型
signal函数返回的是一个函数指针,此函数指针参数为int,返回类型为void
为了便于我们理解,可以写成这样

void (*)(int)   signal(int, void(*)(int));

但是这样书写是错误的,当函数返回类型为函数指针的时候不能像普通函数一样,将返回类型写在函数名字前面,而是要将函数体当做函数指针的名字编写


还有当使用typedef重命名函数指针时,也不能 想普通变量一样将新名字写在类型后面如:

typedef long double lble;
typedef void(*)(int)  pfun_t;//错误的

而是要将新名字写在函数指针的名字的位置:

typedef void(*pfun_t)(int);//正确的

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

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

相关文章

JavaSE从基础到入门:异常的学习

1. 异常的概念与体系结构 1.异常的概念 异常&#xff08;Exception&#xff09;指不期而至的各种状况&#xff0c;异常发生的原因有很多&#xff0c;通常包含以下几大类&#xff1a; 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断&#xff0c;或者JVM内存溢出…

HDMI1.4/2.0 Subsystem官方例程的建立

HDMI1.4/2.0 Subsystem官方例程的建立1、 项目背景明德扬(MDY)为某研究所研制的视频接口转换模块&#xff0c;该模块将HDMI视频转成LVDS7:1视频。视频输入接口采用的是HDMI 4K输入&#xff0c;基于Xilinx K7325t的高速收发器,特点是无需外围HDMI接收芯片&#xff0c;大大简化了…

SpringBoot+VUE前后端分离项目学习笔记 - 【13 SpringBoot和Vue实现导入和导出】

hutool工具 引入Hutool工具使用ExcelWriter&#xff0c;可以将数据写出到EXCEL https://www.hutool.cn/docs/#/poi/Excel%E5%B7%A5%E5%85%B7-ExcelUtil 引入pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactI…

项目中不容忽视的图表报表

在项目工作中&#xff0c;报表可是少不了的好帮手&#xff0c;可以帮助我们向合作者以及领导直观地展示项目情况进展。项目报表的作用可以从多维度监控项目的运行&#xff0c;保障项目的顺利进行。让数据可视化&#xff0c;辅助管理者进行合理决策。及时与合作者共享项目信息&a…

使用ros从realsence相机中获取图像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、使用ros从realsence相机中获取录制的视频并播放1.开启ros内核2.打开realsense相机3.查看当前话题4.在相机界面显示RGB图像和depth图像4.1 添加Image4.2 填入…

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候&#xff0c;一定使用过javac和java这两个命令。大家在安装JDK的时候&#xff0c;验证是否安装成功&#xff0c;都会在命令行里输入java和javac命令来验证&#xff0c;这就是我们第一次使用java和…

PDF怎么编辑注释? 5 个免费好用的 PDF 注释器

成群结队的人和组织想要注释他们的 PDF 文档的原因有很多。无论哪种情况&#xff0c;目标是做到近乎完美并不是完美。但是&#xff0c;如果您没有合适的 PDF 注释器&#xff0c;这又是不可能的。虽然这些 PDF 注释器工具中的许多都很昂贵&#xff0c;但您仍然可以使用免费的 PD…

tkintertools 模块实战一:任务清单小工具

之前我自己写了一个 tkinter 模块的辅助模块 —— tkintertools&#xff0c;这次试着用这个模块开发了一款可以记录任务的小工具&#xff0c;应该会比较实用。tkinter 模块的最强辅助模块 —— tkintertools&#xff08;万字详解&#xff09;_小康2022的博客-CSDN博客tkinter 模…

数字图像处理实验(直方图均衡化规定化)

图像均衡化 图像均衡化是一种图像处理技术&#xff0c;它的目的是改善图像的对比度。 具体来说&#xff0c;对于一张图像&#xff0c;其直方图就是统计图像中各灰度级出现的次数的图像。通常情况下&#xff0c;图像的直方图会呈现不平衡的状态&#xff0c;即图像的某些灰度级出…

SQLSERVER 的主键索引真的是物理有序吗?

一&#xff1a;背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化&#xff0c;书中说当一个表创建了聚集索引&#xff0c;那么表中的行会按照主键索引的顺序物理排列&#xff0c;这里有一个关键词叫&#xff1a;物理排列&#xff0c;如果不了解底层原理&#xff0c;真的…

5G NR标准: 第18章 射频特性

第18章 射频特性 如第 3 章所述&#xff0c;NR 的射频特性与 5G 的可用频谱以及在这些频谱分配中运行所需的频谱灵活性密切相关。 虽然频谱灵活性一直是前几代移动系统的基石&#xff0c;但对于 NR&#xff0c;这一点变得更加突出。 它由几个组成部分组成&#xff0c;包括在不…

C++11 线程异步

文章目录1. 线程异步的概念2. future2.1 共享状态2.2 常用成员函数3. promise3.1 常用成员函数3.2 promise的基本使用4. package_task4.1 常用成员函数4.2 package_task的基本使用5. async5.1 async的基本使用6. promise、package_task、async的对比与总结1. 线程异步的概念 问…

干货 | 读懂 Appium 日志,让测试效率翻倍!

Appium 服务器运行时会产生很多日志&#xff0c;但是很多人并不了解其中的意义&#xff0c;也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志&#xff0c;并让你的测试效率翻倍。开启服务日志第一行显示了 Appium 版本和运行地址。$ appium[Appium] Welcome to Appiu…

曾经对程序员最好的公司,倒下了

硅谷有一家公司&#xff0c;它发明了同时代最好的CPU&#xff0c;最好的操作系统&#xff0c;最好的编程语言&#xff0c;但是由于傲慢和目光短浅&#xff0c;在短短二十多年间就走到了尽头。它就是Sun Microsystems&#xff0c;硅谷最让人惋惜的公司。1Sun的出现是个巧合。80年…

运动蓝牙耳机哪个品牌好、2023年最出色运动蓝牙耳机推荐

上班通勤、娱乐和运动时间都需要一款耳机的陪伴。相信音乐是许多健身爱好者锻炼时的必备&#xff0c;在枯燥的运动中用音乐分散注意力&#xff0c;不仅可以提高运动的积极性&#xff0c;还能让身体产生一种非常奇妙的愉悦感。不过&#xff0c;想要在运动中获得更好的聆听体验&a…

【图像处理OpenCV(C++版)】——3.2 几何变换之投影变换

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

前端高频vue面试题总结

created和mounted的区别 created:在模板渲染成html前调用&#xff0c;即通常初始化某些属性值&#xff0c;然后再渲染成视图。mounted:在模板渲染成html后调用&#xff0c;通常是初始化页面完成后&#xff0c;再对html的dom节点进行一些需要的操作。 如何从真实DOM到虚拟DOM …

springboot 全局 Date参数接收 String格式 转换异常报错

报错&#xff1a; .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.util.Date from String "2022-12-13 11:22:11": not a v…

C语言实现c++对象和私有成员

C语言实现c对象和私有成员 C语言实现c对象 类是C中面向对象编程思想中比较重要的组成部分&#xff0c;与结构体一样类只是一个模板只有在创建对象时才会申请内存空间&#xff0c;类其实是把具有共同特性的数据或方法&#xff08;面向对象编程中&#xff0c;一般把函数称为方法…