指针数组与数组指针---傻傻分不清楚?

news2025/1/18 11:42:30

目录

  • 1.指针数组
  • 2.数组指针

1.指针数组

什么是指针数组呢?
我们通过以前学过的数组进行类比:

  • 整形数组是存放整形的数组
  • 字符数组是存放字符的数组
  • 所以,指针数组是存放指针(地址)的数组

整形数组的书写形式是int arr[10],字符指针书写形式是char arr[10],所以字符指针的书写形式是int *arr[10] char* arr[10]
接下来创建一个字符指针数组

int main()
{
	char a = 'a';
	char b = 'b';
	char c = 'c';
	char d = 'd';
	char* arr[4] = {&a,&b,&c,&d};
	return 0;
}

创建了四个char类型变量,将他们取地址放到字符指针数组里,这是最基本的应用

还可以将字符串放到字符指针数组里,字符串本质上是数组,数组名是数组首元素地址,所以将四个字符串名放到字符指针数组里即可

int main()
{

	char str1[] = "hello";
	char str2[] = "world";
	char str3[] = "byebye";
	char str4[] = "world";

	char* arr[4] = {str1,str2,str3,str4};
	return 0;
}

在这里插入图片描述

还可以用一维指针数组模拟二维数组

#include <stdio.h>
int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };
	int arr4[5] = { 5,6,7,8,9 };
	int arr5[5] = { 0,1,0,2,0 };

	int* arr[5] = { arr1,arr2,arr3,arr4 ,arr5};
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
	return 0;
}

前面说过,对于一个指针p , *(p+i)p[i]等价
所以上述程序中的*(*(arr + i) + j)也可以写成arr[i][j],也就是如二维数组一样的写法
这个指针数组的结构:
在这里插入图片描述


2.数组指针

对于数组指针,还是类比其他类型指针

  • 整形指针是一个指向整形变量的指针
  • 字符变量是一个指向字符变量的指针
  • 所以数组变量就是一个指向数组的指针
  • 整形指针的类型是int*,字符指针的类型是char*,所以数组指针的类型就是int(*)[10]
char ch = 'w';
char *pc = &ch;

int num = 10;
int* pi = &num;

int arr[10];
int(*pa)[10] = &arr;

在这个整形数组指针,*先与pa结合:(*pa),所以int(*pa)[10]是一个指针

在这里赋给数组指针的是数组名取地址,那么数组名和数组名取地址有什么区别呢?请点击跳转另一篇文章:数组与地址,数组名到底是什么?


数组指针到底怎么用呢?

之前如果要输出一个整形数组,我们可以使用指针,这里的指针通常是数组元素首地址

但是如果非要用数组指针输出数组中的元素也是可以的

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

这里的p是一个数组指针,先将解引用*p,得到数组,然后通过下标访问(*p)[i])就可以得到数组元素了

但是这样做是很别扭的,不如直接用整形指针输出

其实 数组指针在一位数组中用的不多,在二维数组中会用到

在以往的对于二维数组的传参,定义函数时,在参数列表中最简单的写法是直接以二维数组的形式传形参

void print(int arr[3][4], int x, int y) //直接以二维数组的形式写是最简单的
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][4] = { {1,2,3,4},{2,3,4,5},{3,4,5,6} };
	print(arr, 3, 4);
}

但是,对于一位数组int arr[10],如果在函数中想要接受它,不但可以以数组的形式接受,用一个一级指针接受也是可以的


void printf(int arr[10],int x,int y)  //可以用数组的形式接收
{
	;
}

void printf(int *arr,int x,int y) //也可以用指针的形式接收
{
	;
}
int main()
{
	int arr[10] = { {1,2,3,4},{2,3,4,5},{3,4,5,6} };
	print(arr, 3, 4);
}

如果也想要用一个指针去接受二维指针就略有不同了

函数实参传一个二维数组名过去,数组名是数组首元素地址,所以二维数组数组名就是一个一维数组的地址,这个二维数组名其实就是一个数组指针,所以在函数中要用一个数组指针去接收

void print(int(*arr)[4],int x,int y)  //用一个数组指针去接收
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y;j++)
		{
			printf("%d ", (*(arr+i))[j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][4] = { {1,2,3,4},{2,3,4,5},{3,4,5,6} };
	print(arr, 3, 4);
}

学过了数组指针和指针数组,看看下面这些都是什么?

int arr[5];
int *parr1[10];
int (*parr2)[10];
int (*parr3[10])[5];
  1. int arr[5],是一个长度为5的整形数组
  2. int *parr1[10],是一个整形指针数组,长度为10,里面存放整形指针
  3. int (*parr2)[10],是一个数组指针,parr2指向一个长度为10的整形指针
  4. int (*parr3[10])[5],这个比较复杂,一步一步分析,首先看名称parr3先与[10]结合,所以这是一个数组,长度为10,然后剩下int(*)[5],所以在数组parr3中存放的是类型为int(*)[5]的数组指针,它指向一个长度为5的整形数组。

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

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

相关文章

uniapp兼容小程序和H5遇见的坑

目录 一、报错 vue service.requestcomponentinfo:typeerror:cannot read property matches undefined H5不兼容uni-app的image标签 小程序externalClasses不兼容h5 H5不兼容van-picker和van-datetime-picker 一、报错 vue service.requestcomponentinfo:typeerror:cannot r…

【C语言进阶】 一篇带你掌握字符串和内存函数

目录一&#xff1a;strlen模拟实现&#xff1a;二&#xff1a;strcpy模拟实现&#xff1a;三&#xff1a;strcat模拟实现&#xff1a;四&#xff1a;strcmp模拟实现&#xff1a;五&#xff1a;strncpy模拟实现&#xff1a;六&#xff1a;strncat模拟实现&#xff1a;七&#xf…

如何正确地连接PLC与7种设备的输入输出线路

正确地连接输入和输出线路&#xff0c;是保证PLC可靠工作的前提。想要正确地连接PLC与7种设备的输入输出线路&#xff0c;就需注意以下几个方面&#xff1a;1.PLC与主令电器类设备的连接下图是PLC与按钮、行程开关、转换开关等主令电器类输入设备的接线示意图。图中的PLC为直流…

3、运算符

目录 一、算数运算符 二、关系运算符 三、逻辑运算符 一、算数运算符 MATLAB中的算术运算符有加、减、乘、除、点乘、点除等&#xff0c;其运算法则表&#xff1a; 示例1&#xff1a;数值与矩阵的算术运算 Aeye(2)Bones(2)CA*BDA.*B 运行结果&#xff1a; 此外&#xff0…

25.数组指针取*,指针和函数的关系,指针作为函数的参数

数组指针取* 数组指针取*&#xff0c;并不是取值的意思&#xff0c;而是指针的类型发生变化&#xff1b; 一维数组指针取*&#xff0c;结果为它指向的一维数组第0个元素的地址&#xff0c;它们还是指向同一个地方。二维数组指针取*&#xff0c;结果为一维数组指针&#xff0c…

Excel实战 第1章 数据处理

目录1 数据规范2. 导入数据3. 数据清洗3.1 重复数据处理3.2 缺失数据处理3.3 空格数据处理1 数据规范 2. 导入数据 3. 数据清洗 3.1 重复数据处理 数据透视表法&#xff08;首选&#xff09; 选中A、B两列&#xff0c;点击【插入】–》【数据透视表】 把号码拉到【行】&…

LeetCode 207. 课程表

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 207. 课程表&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 207. …

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(下)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Docker面试题(史上最全 + 持续更新)

专题37&#xff1a;Docker面试题&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V26 《尼恩面试宝典》升级的规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼恩获取&…

VALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers

文章目录NLP中Bert的进展历史word embeddingELMOGPTBertAudioLM: a Language Modeling Approach to Audio Generationabstractintrorelated workVALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizersabstractspeech quantizationtraining:condition…

程序的机器级表示part2——访问信息

目录 1. 整数寄存器 2. 操作数指示符与寻址模式 3. 数据传送指令 4. 压入和弹出栈数据 1. 整数寄存器 一个x86-64的CPU包含一组16个存储64位值的通用目的寄存器(general-purpose registers) 整型寄存器x86-64的CPU是64位的&#xff0c;因此相应的寄存器长度与机器字长(数据…

基于matlab实现的水果识别系统+源码+代码注释

水果识别 摘要&#xff1a; 本项目针对多种常见水果混合的图像&#xff0c;利用 Matlab 软件&#xff0c;对水果的识别进行研究。根据水果和背景的差别选取阈值&#xff0c;对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测&#xff0c;选定连通区域&#xff0…

仅需一个注解,实现springboot项目中的隐私数据脱敏

文章参考&#xff1a; 仅是为了方便查看&#xff0c;因此在此记录一下​​​​​​​ 目录 1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum 2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt 3. 创建自定义序列化器&#xff1a;PrivacySerializer 4. 隐私数据隐藏工…

高德地图开发之地图配置及vue上初始化创建地图

开门见山地说&#xff0c;现如今地图相关的开发业务在工作中越来越常见&#xff0c;目前市面上主流的地图开发还是以百度和高德为主&#xff0c;今天就来讲一下高德地图的配置和在vue上的初始化创建&#xff0c;帮助大家更好更快的了解高德地图开发相关的内容。 一. 注册地图 …

Python协程的四种实现方式

今天继续给大家介绍Python关知识&#xff0c;本文主要内容是Python协程的四种实现方式。 一、yield关键字实现方式 以yield关键字方式实现协程代码如下所示&#xff1a; def fun1():yield 1yield from fun2()yield 2def fun2():yield 3yield 4f1fun1() for item in f1:print…

steam搬砖项目靠谱吗?怎么样?

Steam搬砖’通俗来讲&#xff1a;小白都可以轻松上手&#xff0c;不需要会玩游戏&#xff0c;项目就是利用低价美金充值卡&#xff0c;从国外Steam平台购买CS:GO游戏装备回来&#xff0c;在国内网易BUFF平台售卖&#xff0c;低买高卖&#xff0c;产生利润的一个项目 首先&…

javascript实现版本号自增打包vue写入版本号

文章目录Preface代码方法一&#xff1a;兼容多长版本号。如&#xff1a;1.0.0.0.0.0方法二&#xff1a;只针对3位版本号打包时写入版本号Preface 前段时间出差去帮忙别的项目&#xff0c;项目中有前端更新提醒用户更新。 更新提示是放在了axios请求中。 这个需求是别人做的&…

再学C语言34:数组

数组&#xff08;array&#xff09;由一系列类型相同的元素构成 数组的声明&#xff1a;包括数组元素的数目和元素的类型&#xff0c;编译器根据这些信息创建合数的数组&#xff0c;数组元素可以具有同普通变量一样的类型&#xff1a; int main(void) {int a[5]; // 包含5…

ESP32-C3 迷你智能语音照明

一、概述二、硬件原理图设计三、硬件PCB软件设计四、软件设计五、结构设计六、总结一、概述本设计是使用ESP32-C3芯片&#xff0c;结合TP4057锂电池充电管理芯片、SIQ-02FVS3旋转编码器、离线语音识别模块、无源蜂鸣器、TYPE-C接口设计的一款迷你智能照明产品。功能特点&#x…

vue组件传值方式有哪些

Vue 作为一个轻量级的前端框架&#xff0c;核心两大特性就是响应式编程和组件化。 本文针对组件之间传值做详细讲解。 Vue就是由一个一个的组件构成的&#xff0c;组件化是它的精髓&#xff0c;也是最强大的功能之一。而组件实例的作用域是相互独立的&#xff0c;这就意味着不…