首页 > 其他分享 >深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】

深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】

时间:2024-03-18 18:30:44浏览次数:27  
标签:10 typedef 变量 int 数组 函数指针 指针

一.数组指针变量

1.什么是数组指针变量?

说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数组的指针变量。思考一下 int* p1[10] 和 int(*p2)[10]分别代表的是什么。int* p1[10]这里的p1是指针数组,有十个元素,每一个元素都是指针。p2是指针变量,指向的是一个大小为十个整型的数组。

#include <stdio.h>
void print(int(*p)[5], int r, int c)//所以我们这里用了一个数组指针来接收一维数组的地址
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (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;
}

这里需要注意,这里的()非常重要,因为[]的优先级是高于*号的,所以要加上()来保证p先和*结合。

2.数组指针变量怎么初始化?

int main()
{
	int arr[10] = { 0 };
	int(*p2)[10] = &arr;
	return 0;
}

很简单,既然想要指针,直接用取地址符号&取出数组arr的地在赋值给p2就行了。那么这里的p2的类型是什么类型呢?我们知道如果是指针数组(int* p1[10])的话,它的类型就是int*。那么数组指针的类型就是int(*)[10],同样的,&arr的类型也是int(*)[10]。

3.二维数组传参的本质

我们可以先想一下关于二维数组的基本概念,我先给一个数组arr[10][10]关于二维数组名,其实代表的就是首元素的地址,但是这里的首元素代表的可不是arr[0][0],而是arr[0],代表的是第一行的地址。第一行的地址就是一维数组的地址,类型就是数组指针类型。给大家写一个代码。

这是最终的输出结果

总的来说,二维数组传参的本质上也是传递了指针,是第一行的这个一维数组的指针。跟一维数组差不多,在传参的时候,形参的部分可以写成数组,也可以写成指针形式。

二.函数指针变量

1.函数指针变量的创建

前面我们已经说过了,数组指针指向的是数组的地址,那么函数指针自然就是指向函数的指针。其实,如果已经理解了数组指针,这个就比较好理解了。

#include<stdio.h>
void Add(int x, int y)
{
	return x+y;
}
int main()
{
	int (*p)(int, int) = &Add;
	return 0;
}

关于int (*p)(int, int)这个东西大家可以单独的先看int (*)(int, int),这个东西就是函数指针的类型

2.函数指针变量的使用

使用的方法也是很简单,还是上面的加法函数。咱们调用的话应该就是直接写函数名,后面跟上参数。既然学习了函数指针,这里我们就可以稍微改变一下。

#include<stdio.h>
void Add(int x, int y)
{
	return x+y;
}
int main()
{
	int (*p)(int, int) = &Add;
	int ret = (*p)(2, 3);//函数指针调用,其实这里不用解引用
	printf("%d \n", ret);

	int a = p(3, 4);//因为我们在用函数名调用函数的时候,函数名本身就是地址,所以这里不用解引用就可以直接用
	printf("%d ", a);
	return 0;
}

这个就是函数指针的简单运用了。

三.typedef关键字

关于typedef关键字,它的作用是类型重定义。简单的说,我有一个类型叫做unsigned int,但是我觉得这种类型的名字太长的,我如果需要频繁使用这种类型,那么太长的话就很难受了,这时我们可以用typedef关键字,重新给它取一个名字。比如

typedef unsigned int u_int;

以后我们如果再去使用它的时候,就可以直接使用u_int。比如我定义a为unsigned int类型,这时我们就可以直接写成u_int  a;这跟unsigned int  a是等价的。但是对于数组指针变量和函数指针变量要特殊对待一下。

typedef void(*p)(int);//函数指针变量:这里的p就是void(*)(int)
typedef int(*p1)[10];//数组指针变量:这里的p1就是int(*)[5]

可千万不能写成了typedef   void(*)(int)  p,这种写法是绝对错误的。

define和typedef对比

先思考一下这里的p1,p2,p3,p4分别对应的是什么类型。

#define PTR_T int*
typedef int* ptr_t;
int main()
{
	ptr_t p1, p2;
	PTR_T p3, p4;
	return 0;
}

正确答案是p1,p2,p3这三个是指针变量,p4是整型变量。

具体是为什么呢?

我们通过define定义的PTR_T是直接把int*给替换过来了。大家可以这样理解。

感谢观看,请多多指正。

标签:10,typedef,变量,int,数组,函数指针,指针
From: https://blog.csdn.net/2301_81699364/article/details/136781345

相关文章

  • Go01-开发环境搭建+注释+基本数据类型+指针+命名规范
    Go01-开发环境搭建+注释+基本数据类型+指针+命名规范1.Go常用网站https://www.topgoer.com/,Go学习网站,包含Go基础教程、beego、lris等Go开发常用框架。Go开发软件下载:https://code.visualstudio.com/,VSCode;https://www.jetbrains.com/zh-cn/go/,GOLand。https://studygolang.c......
  • 华为openEuler系统安装openjdk并配置环境变量
    华为openEuler系统安装openjdk并配置环境变量1、安装JDK软件包执行dnflistinstalled|grepjdk查询JDK软件是否已安装。$dnflistinstalled|grepjdk查看命令打印信息,若打印信息中包含“jdk”,表示该软件已经安装了,则不需要再安装。若无任何打印信息,则表示该软......
  • 【黑马MySQL】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
    前言大家好吖,欢迎来到YY滴MySQL系列,热烈欢迎!本章主要内容面向接触过C++Linux的老铁主要内容含:欢迎订阅YY滴C++专栏!更多干货持续更新!以下是传送门!YY的《C++》专栏YY的《C++11》专栏YY的《Linux》专栏YY的《数据结构》专栏YY的《C语言基础》专栏YY的《初学者易......
  • 配置全局变量直接调用函数
    配置全局变量直接调用函数目的想要在项目中使用defs.utills.getFunction()的方式,直接调用我们的函数,不再使用import的方式进行导入,直接在工程化上做手脚进行自动导入解决。过程首先我们在我们的项目框架src/目录下定义一个全局的utill文件,这个我们可以分类型创建文件夹、......
  • C语言指针完整总结!!!
    1.指针介绍1.简介:C语⾔中给地址起了新的名字叫:指针。一个内存单元是一字节内存单元的编号==地址==指针在x86的环境中,一共有32根地址总线,即32个比特位。一个字节有八个比特位,而⼀个比特位可以存储⼀个2进制的位1或者0,因此32根地址线,就能表示2^32种含义,每⼀种含义都......
  • 深入了解指针(2)【指针与数组】【二级指针】
    一.使用指针访问数组关于数组,我在上次的博客中也提到了一些比较重要的知识点。首先就是数组名,数组名只有在两种情况下代表的是整个数组的地址,一个是在sizeof里面,一个是用&符号。那么为什么我们可以用指针来访问数组呢?因为数组在内存中是连续存放的,只要我们找到第一个地址,那么......
  • C++中的this指针、访问控制和构造函数
    C++中的this指针、访问控制和构造函数this指针在C++中,this指针是一个特殊的指针,它指向当前对象的地址。每个非静态成员函数(包括成员函数模板)都有一个this指针作为其隐含参数,这意味着在成员函数内部,this可以用来引用调用该成员函数的对象。this指针是自动传递给成员函数的,......
  • antd 的selectRowkeys 换变量名不生效了
    如果在AntDesign的ProTable中尝试更改selectedRowKeys的属性名(例如换成其他名字),可能会导致无法正确地管理表格行的选中状态。在ProTable中,selectedRowKeys是一个特定的属性名,用于表示当前选中的行的keys列表。如果你需要将selectedRowKeys更改为其他属性名,可以通过......
  • 05_C++数组指针和指针数组
    1.数组指针:当数组指针指向一个一维数组时,()优先级高,说明p是指针,指向一个整型的一维数组。这个一维数组的长度是n,也可以说p的步长为n。当p+1时,p指针会跨过n个整型数据的长度。2.指针数组:当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址......
  • 2.3C++对象模型和this指针
    1、成员变量和成员函数分开存储在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上空对象占用内存空间为1。C++编译器会为每个空对象也分配1个字节的空间,是为了区分空对象占内存的位置。每个空对象也应该有一个独一无二的内存地址。calssPerson{......