首页 > 其他分享 >深入了解指针(5)

深入了解指针(5)

时间:2024-08-09 23:25:08浏览次数:10  
标签:变量 int 地址 了解 深入 数组 函数指针 指针

1. 数组指针变量 2. ⼆维数组传参的本质 3. 函数指针变量


2. ⼆维数组传参的本质
3. 函数指针变量
)

1.数组指针变量
1.1了解数组指针变量的概念
整形指针变量 ——变量——存放的是整形的地址
字符指针变量——变量——存放的是字符的地址
数组指针——变量——存放的是数组的地址

int (p)[5]
诠释: * 先与p结合 说明 p是一个指针变量 , [5]代表的是存放的是5个整形的数组,所以p是一个指针,指向数组,这就是一个数组指针。
注意:[]的优先级比
高所以要用()确保p先于*结合。

1.2数组指针变量初始化

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int arr[3] = { 0 };
	int(*p)[3] = &arr;//得到的是数组的地址
	return 0;
}

p与&arr的类型一样
在这里插入图片描述
2.二维数组传参的本质

二维数组传参,形参是数组时

void xs(int a[3][4], int b, int c)
{
	for (int i = 0; i < b; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", a[i][j]);
		}
	}
}
int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	xs(arr, 3, 4);
	return 0;
}

根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀维数组的地址。根据上⾯的例⼦,第⼀⾏的⼀维数组的类型就是 int [4] ,所以第⼀⾏的地址的类型就是数组指针类型 int(*)[4] 。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,那么形参也是可以写成指针形式的。如下:

void xs(int(*p)[4], int b, int c)
{
	for (int i = 0; i < b; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", *(*(p+i)+j));
		}
	}
}
int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9 ,10,11,12};
	xs(arr, 3, 4);
	return 0;
}

3.函数指针变量

变量可以取地址、数组可以取地址、函数也可以取地址。
写一个简单函数来看看

int mul(int x, int y)
{
	return x * y;
}
int main()
{
	printf("%p\n", mul);
	printf("%p\n", &mul);
	return 0;
} 

在这里插入图片描述
函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名的⽅式获得函数的地址。
如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针⾮常类似。如下:
3.1 函数指针变量的创建


int (*p)(x, y) = mul;//x和y写上或者省略都是可以的

int —— p指向函数的返回类型
(*p)—— 函数指针变量名
(int x, int y)—— p指向函数的参数类型和个数的交代

3.2 函数指针变量的使⽤

int mul(int x, int y)
{
	return x * y;
}
int main()
{
	int (*p)(x, y) = mul;//x和y写上或者省略都是可以的
		int ret = (*p)(2, 4);
	printf("%d\n", ret);
	printf("%d\n", (*p)(2, 3));
	printf("%d\n", p(3, 4));
	return 0;
}

在这里插入图片描述
持续指针系列

标签:变量,int,地址,了解,深入,数组,函数指针,指针
From: https://blog.csdn.net/2401_85487314/article/details/141072137

相关文章

  • 项目文档管理利器:2024年你必须了解的工具
    国内外主流的10款项目文档管理软件对比:PingCode、Worktile、Teambition、Tapd、Tower、Confluence、Notion、DropboxPaper、Quip、Basecamp。在面对项目管理的复杂性时,选择合适的文档管理工具可以显著提高效率和团队协作。许多团队在文档管理上遭遇混乱和效率低下,尤其是在处理......
  • 超简单适合练手的双指针题:判断子序列
    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例1:输入:s="abc",t="ahbgdc"输出:true示例2:输入:s="axc......
  • 【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
    前言:在C++编程语言中,异常处理是一种重要的机制,它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C++异常处理的相关知识点,包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。目录1.异常处理的基本概念1.1异常的定义1.2异常的抛出......
  • 深入分析编程命名规范:成员变量命名约定的比较与分析
    目录标题1.引言2.成员变量命名约定简介谷歌命名规范Qt命名规范微软命名规范其他使用`_`前缀的规范小结3.各命名规范的详细分析谷歌命名规范:成员变量后缀`_`Qt和微软命名规范:成员变量前缀`m_`其他使用`_`前缀的规范比较总结4.综合比较可读性可维护性学习曲......
  • 如何安全高效地进行企业文档外发,一文了解什么是文档安全系统密文外发!
    企业文档的外发已成为日常工作中不可或缺的一环。然而,随着数据泄露事件的频发,如何安全高效地外发文档成为了企业关注的焦点。今天,就让我们一起深入了解文档安全系统的密文外发技术,为企业信息安全保驾护航。什么是文档安全系统密文外发?文档安全系统密文外发,是一种基于先进......
  • C语言---指针的运算和各种类型的指针
    指针的运算1.指针+1或者指针-1是什么意思?把指针中记录的内存地址,往后或者往前移动一个步长2.什么是步长?跟什么有关?跟数据类型有关Windows64位操作系统:char:移动一个字节short:移动两个字节int:移动四个字节long:移动四个字节longlong:移动八个字节有意义的操作......
  • 一文带您了解如何降低对象存储成本
    本文分享自天翼云开发者社区《一文带您了解如何降低对象存储成本》,作者:刘****筠首先,需要了解天翼云对象存储(原生版)I型ZOS的三种存储类型,分别供标准、低频、归档存储,全面覆盖从热到冷的各种数据存储场景,您可根据使用场景和性能要求选择合适的存储类型。标准存储提供高可靠、高可......
  • 【原创】【深入浅出系列】之代码可读性
    这是“深入浅出系列”文章的第一篇,主要记录和分享程序设计的一些思想和方法论,如果读者觉得所有受用,还请“一键三连”,这是对我最大的鼓励。一、老生常谈,到底啥是可读性一句话:见名知其义。有人说好的代码必然有清晰完整的注释,我不否认;也有人说代码即注释,是代码简洁之道的最高境......
  • 什么是大模型?一文速通了解什么才是真正的大模型
    在这个充满变革的时代里,人工智能领域的几个关键词——ChatGPT、OpenAI、大模型、提示词工程以及“幻觉”频繁出现在我们的视野中,它们如同一股不可忽视的力量,冲击并重塑着我们的认知。这些术语不仅代表了技术的前沿动态,也引发了社会各界的广泛讨论与关注。什么是大模型当......
  • OpenTiny HUICharts开源发布,带你了解一个简单、易上手的图表组件库
    摘要:目前OpenTinyHUICharts已经成功落地在华为内部100多个产品中,持续提升了用户的可视化体验。本文分享自华为云社区《OpenTinyHUICharts正式开源发布,一个简单、易上手的图表组件库》,作者:OpenTiny。引言大家好!我们非常高兴地跟大家宣布,今天正式发布我们的新产品——Open......