【C语言】数组指针与指针数组

news2025/1/2 22:42:55

前言

前面的文章讲了指针的一些基本内容,这里我们来讲一下数组指针与指针数组,数组指针是指针运用的一个明显体现,准确来说是通过指针访问内存地址的具体体现

一、一维数组的指针

首先,我们先来看一段代码

#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* pa = &arr[0];
	int* p = arr;
	
	printf("pa -> %p\n", pa);
	printf("p  -> %p\n", p);

	return 0;
}

在这里插入图片描述
在上述结果中我们发现,数组arr的首元素地址与arr这个数组的名字是一样的,所以数组名就是首元素的地址


同时在【C语言】自定义类型数据-数组这篇文章中我们说过,数组是一个连续的内存空间,所以,我们可以通过指针的运算来逐一访问数组的元素,请看下面的代码

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

在这里插入图片描述


arr是首元素地址的特殊情况

一、&arr
我们上面说了,数组名arr就是数组arr首元素的地址,那么当我们&arr时,得到的会是什么呢?那让我们看一下下面的代码

#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* pa = &arr[0];

	printf("pa   -> %p\n", pa);
	printf("parr -> %p\n", &arr);

	printf("pa + 1   -> %p\n", pa + 1);
	printf("parr + 1 -> %p\n", &arr + 1);

	return 0;
}

在这里插入图片描述
结果如下:
pa -> 000000D1FA16F5D8
parr -> 000000D1FA16F5D8
pa + 1 -> 000000D1FA16F5DC
parr + 1 -> 000000D1FA16F600
我们可以发现,pa与pa + 1相差了4个字节,也就是一个整形,但是parr与parr + 1相差了40个字节,隔了一个数组的大小,也就是说,&arr得到的parr是整个数组的地址,当parr + 1时指针会走过一个数组,所以此时的arr不是首元素的地址,而是整个数组

二、sizeof(arr)
我们先看代码

#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* pa = &arr[0];
	
	printf("sizeof(pa) -> %zd\n", sizeof(pa));
	printf("sizeof(arr) -> %zd\n", sizeof(arr));

	return 0;
}

在这里插入图片描述
这里我们可以发现,sizeof(arr)得到的并不是地址的大小,而是arr数组的大小,也就说sizeof(arr)中的arr并不代表着首元素的地址,而是代表整个数组的


二、二维数组指针

我们上面很详细地介绍了一维数组的指针,接下来我们介绍一下二维数组的指针,对于二维数组我们可以如此定义:

类型 (*ptr)[M] = arr;

这里的类型也就是二维数组的元素的数据类型,而ptr则是指针的名称,M则是一行数组的元素数量,我们看下面的代码

#include <stdio.h>
int main() {
	int arr[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int(*pa)[5] = arr;

	return 0;
}

这里我们定义了一个行为2列为5的二维数组指针变量,那么,这个指针变量究竟是什么呢?让我们继续看下面的代码

#include <stdio.h>
int main() {
	int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
	int(*pa)[5] = arr;

	printf("*pa        -> %p\n", *pa);
	printf("&arr[0]    -> %p\n", &arr[0]);
	printf("&arr[0][0] -> %p\n", &arr[0][0]);
	printf("\n");
	printf("*(pa + 1)  -> %p\n", *(pa + 1));
	printf("&arr[1]    -> %p\n", &arr[1]);
	printf("&arr[1][0] -> %p\n", &arr[1][0]);

	printf("\n");
	printf("**pa       -> %d\n", **pa);

	return 0;
}

在这里插入图片描述
其实我们根据结果可以发现二维数组的指针是一个二级指针,而且存放的是一个行数组的指针(arr[0]),也就是首元素地址,当我们进行(pa + 1)时,指针变成了第二行数组的指针(arr[1]),也是第二行数值的首元素地址,我们可以简单用图表示*
在这里插入图片描述
所以通过指针我们也可以对二维数组进行访问


三、指针数组

我们之前说过,数组是一种基本的数据结构,用于存储相同类型的多个值,当然相同类型的多个值也包括指针类型,所以我们可以定义一个数组来存储我们的指针,请看下面的代码

#include <stdio.h>

int main() {
	int* ptrarr[3] = { 0 };
	int arr[3] = { 1,2,3 };
	
	ptrarr[0] = &arr[0];
	ptrarr[1] = &arr[1];
	ptrarr[2] = &arr[2];

	for (int i = 0; i < 3; i++) {
		printf("ptrarr[%d] -> %p\n", i + 1, ptrarr[i]);
	}

	return 0;
}

在这里插入图片描述
这里我们定义了一个整形类型指针数组用来储存我们的整形指针,定义指针类型的方法与定义普通类型的数组是一样的,所以我就不再多讲啦!


End

对于指针的所有内容,博主只能到这个地步啦,谢谢大家的阅读,希望我的文章对大家有帮助!

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

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

相关文章

30天面试打卡计划 2024-12-25 26 27 面试题

2024-12-25 面试题 后端 MySQL三层B树能存多少数据&#xff1f; B 树&#xff1a;一种特殊的多路平衡查找树&#xff0c;广泛应用于数据库索引中。它具有所有叶子节点都位于同一层且包含指向相邻叶子节点指针的特点&#xff0c;这使得范围查询更加高效。InnoDB&#xff1a;My…

嵌入式系统 第十一讲 Android操作系统(增加)

• 11.1 Android 操作系统介绍 • Android 是 Google 公司于2007 年11月发布的一款非常优秀的智能移 动平台操作系统。到2011 年第一季度Android 在全球的市场份额首 次超过Nokia的Symbian系统&#xff0c;跃居全球第一。 • Android系统最初由AndyRubin等人于2003年10月创建…

Three.js 字体

在 Three.js 中&#xff0c;我们可以通过 FontLoader 加载字体&#xff0c;并结合 TextGeometry 创建 3D 文本。加载字体是因为字体文件包含了字体的几何信息&#xff0c;例如字体的形状、大小、粗细等&#xff0c;而 TextGeometry 则是根据字体信息生成 3D 文本的几何体。 在…

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系: rl命名空间下,主要有八大模块。 搞定VS后将逐个拆解。 1、编译运行 根据报错提示,配置相应错误的库(根据每个人安装位置不同而不同,我的路径如下:) 编译所有,Release版本耗时大约10分钟。 以rlPlan运动…

【GUI-PyQt5】简介

1. 简介 GUI&#xff1a;带图形的用户接口程序&#xff0c;也就是桌面应用。 2. 分类 2.1 基本窗口控件 QMainWindowQwidgetQlabelQLineEdit菜单工具栏 2.2 高级组件 QTableViewQListView容器多线程 2.3 布局管理 QBoxLayoutQGridLayoutQFormLayout嵌套布局 2.4 信号与…

Mysql学习笔记之SQL-4

这篇文章开始介绍SQL语句的最后一个部分&#xff0c;DCL&#xff08;Data Control Language&#xff09;数据库控制语言。 1.简介 DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访 问权限。 这一部分比较简单&#xff0c;主…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来&#xff1f; 查看是否被360主页锁定&#xff0c;地址栏输入chrome://version&#xff0c;看命令行end后面&#xff08;蓝色部分&#xff09;&#xff0c;是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ&#xff1b;Ft 72MHZ PSC71&#xff08;喜欢设置成Ft的倍数&…

内部类(2)

大家还&#xff0c;今天我们继续来学习内部类的知识&#xff0c;今天我们来看看其余几种内部类类型&#xff0c;那么话不多说 我们直接开始。 注&#xff1a;它是一个static的一个常量 一旦初始化就不能够进行修改了. 注:1.一般情况下我们定义常量的时候,会定成大写的: 2.a不…

Go Energy 跨平台框架 v2.5.1 发布

Energy 框架 是Go语言基于CEF 和 LCL 开发的跨平台 GUI 框架, 具体丰富的系统原生 UI 控件集, 丰富的 CEF 功能 API&#xff0c;简化且不失功能的 CEF 功能 API 使用。 特性&#xff1f; 特性描述跨平台支持 Windows, macOS, Linux简单Go语言的简单特性&#xff0c;使用简单…

欧科云链OKLink:比特币与以太坊“双重启动”将如何撬动市场?

近日&#xff0c;OKLink 与 137Labs 联合举办 X Space&#xff0c;围绕宏观经济环境、政策及机构投资的影响等话题&#xff0c;分享如何把握 Web3 中的潜在机会与辨别风险。OKG Research 首席研究员 Hedy、BuilderRocket Accelerator 研究合伙人 Vivienna、VC 分析员 Bunny、BU…

探索仓颉编程语言:功能、实战与展望

目录 引言 一.使用体验 二.功能剖析 1.丰富的数据类型与控制结构 2.强大的编程范式支持 3.标准库与模块系统 4.并发编程能力 三.实战案例 1.项目背景与目标 2.具体实现步骤 (1).导入必要的模块 (2).发送 HTTP 请求获取网页内容 (3).解析 HTML 页面提取文章信息 (…

JavaFX FXML模式下的布局

常见布局方式概述 在 JavaFX FXML 模式下&#xff0c;有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件&#xff0c;以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点&#xff1a;BorderPane 将空间划分为五个区域&…

OpenFeign介绍以及使用

介绍 OpenFeign 是一个声明式的 Web 服务客户端&#xff0c;用于简化在 Java 应用中调用 HTTP API 的过程&#xff0c;在 Spring Cloud 体系里被广泛应用&#xff0c;它有以下关键特性&#xff1a; 声明式调用&#xff1a;基于注解&#xff0c;开发人员只需定义接口并添加注解…

李永乐线性代数:A可逆,AX=B相关推论和例题解题思路

例题1&#xff1a; 思路讲解&#xff1a; 这个 (A-2E)可逆,所以有P(A-2E) E&#xff0c; 也就是(A-2E)的逆矩阵是P&#xff1b; 那么PA (A-2E)的逆 * A B P(A-2E,A)(E,B) 所以就可以直接求出B&#xff0c;也就是(A-2E)的逆 * A 例题2&#xff1a; 思路讲解&#xff1a;…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值&#xff0c;基于固定的利率和定期付款。这是一个金融函数&#xff0c;常用来分析储蓄计划、贷款、或投资的增长。 语法&#xff1a; FV(rate, nper, pmt, [pv], [type])参数说明&#xff1a; rate&#xff08;必需&#xff09;&…

【运维】部署Gitea

部署Gitea Gitea文档 系统&#xff1a;Ubuntu 20.04.6 LTS 步骤&#xff1a; 准备数据库 使用内置 SQLite&#xff0c;无需额外准备。 下载安装 下载最新版本的 Gitea 并安装&#xff1a; wget -O gitea https://dl.gitea.com/gitea/version/gitea-version-linux-amd64 chm…

Redis KEYS查询大批量数据替代方案(推荐SCAN 命令)

文章目录 前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合&#xff08;Sorted Set&#xff09;3. 使用哈希&#xff08;Hash&#xff09;4. 使用 Redis 模块&#xff08;如 RediSearch&#xff09; 总结 前言 在使用 Redis 时&#xff0c;KEYS 命令虽然简单直接…