C语言中的多级指针、指针数组与数组指针

news/2025/2/20 12:53:49

在C语言中,指针是一个非常重要的概念,它为我们提供了直接操作内存地址的能力。通过指针,我们可以访问和修改内存中的数据,实现各种灵活的操作。本文将通过示例代码和详细解释,深入探讨C语言中的多级指针、指针数组和数组指针。

1. 多级指针

多级指针是指指向指针的指针。在C语言中,我们可以定义一个指针变量来存储另一个变量的地址,同样,我们也可以定义一个指针变量来存储另一个指针变量的地址。这就是所谓的二级指针,以此类推,还可以有三级指针、四级指针等。

示例代码:

int a = 20;
int *p = &a;    // 一级指针,指向变量a
int **pp = &p;  // 二级指针,指向一级指针p
int ***ppp = &pp; // 三级指针,指向二级指针pp
printf("%d \n", ***ppp); // 输出20

这里,我们通过三级指针ppp访问到了最初的变量a的值。需要注意的是,每增加一级指针,我们就需要多使用一个*来解引用。

2. 指针数组

指针数组是指数组中的每个元素都是一个指针。指针数组在C语言中常用于存储字符串、函数指针等。

示例代码:

int a1 = 10, b1 = 2, c1 = 3;
int *arr[] = {&a1, &b1, &c1}; // 定义一个指针数组,存储三个整型变量的地址
printf("%d\n", *arr[0]); // 输出10,访问指针数组的第一个元素所指向的值

int **p2 = arr; // 二级指针指向指针数组
printf("%d\n", **p2); // 输出10,通过二级指针访问指针数组的第一个元素所指向的值

这里,我们定义了一个指针数组arr,它存储了三个整型变量的地址。然后,我们定义了一个二级指针p2,让它指向指针数组arr,通过**p2访问到了指针数组的第一个元素所指向的值。

3. 数组指针

数组指针是指向数组的指针。在C语言中,数组名本身就是一个指向数组首元素的指针,但是数组指针和指向数组元素的指针是不同的。数组指针是指向整个数组的指针,它的步长是整个数组的大小。

示例代码:

int arr2[] = {111, 222, 333};
int(*pa)[3] = &arr2; // 定义一个数组指针,指向包含3个整数的数组
printf("%d %d %d\n", *(*pa + 0), *(*pa + 1), *(*pa + 2)); // 输出111 222 333

int arr3[][3]={{11,22,33},{44,55,66}};
int (*p3)[3]=arr3;
printf("%d\n",*(*(p3+1)+2)); // 输出66,通过数组指针访问二维数组的元素
printf("%d\n",p3[1][2]);    // 输出66,直接通过数组名访问二维数组的元素

这里,我们定义了一个数组指针pa,让它指向一个包含3个整数的数组。通过*(*pa + i)的方式,我们可以访问数组中的元素。需要注意的是,*pa表示的是整个数组的首地址,*pa + i表示的是数组中第i个元素的地址,*(*pa + i)表示的就是对应地址上的值了。

同样地,我们还展示了如何通过数组指针访问二维数组的元素。需要注意的是,p3+1表示的是跳过整个一行,因此*(p3+1)表示的是第二行的首地址,*(*(p3+1)+2)表示的就是第二行第三列的元素了。

总结

本文介绍了C语言中的多级指针、指针数组和数组指针的概念和用法。通过示例代码和详细解释,我们可以看到指针在C语言中的灵活性和强大之处。多级指针可以让我们间接地访问和修改内存中的数据;指针数组可以存储多个指针,常用于存储字符串、函数指针等;数组指针可以让我们以整个数组为单位进行操作,提供了更高的效率和灵活性。


http://www.niftyadmin.cn/n/5371485.html

相关文章

SQL持续更新中

问: 什么是SQL? 答: Structured Query Language 结构化查询语言;其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为 方言。 通用语法 SQL 语句可以单行或多行书写,以分号结尾。可使用空格…

谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2

谷歌 DeepMind 联合斯坦福推出了 ALOHA 的增强版本 ——ALOHA 2。与一代相比,ALOHA 2 具有更强的性能、人体工程学设计和稳健性,且成本还不到 20 万元人民币。并且,为了加速大规模双手操作的研究,ALOHA 2 相关的所有硬件设计全部开…

倒计时59天

(来源:b站左程云up 099) 一:求逆元: 1)要保证a可以整除b 2)要保证mod的是一个质数 3)b和mod互质 题目2)3)一般都满足,主要是1) 方法:如求1.…

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS(Content Management System)是一种网站管理系统,它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能,包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

TCP/IP协议以及UDP(超详细,看这一篇就够了)

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录专栏:TCP/IP协议以及UDP(超详细,看这一篇就够了) 🎉欢迎大家点赞👍评论📝收藏⭐文章 TCP/IP协议以及UDP(超详细,看这一篇就够了 前提概括接收端和发送端客户…

python适配器模式开发实践

1. 什么是适配器设计模式? 适配器(Adapter)设计模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁,使得它们可以一起工作,而无需修改它们的源代码。 …

【Larry】英语学习笔记语法篇——换一种方式理解词性

目录 一、换一种方式理解词性 1、名词、形容词、副词,这就是一切 2、词性之间的修饰关系 3、介词其实很简单 形容词属性的介词短语 副词属性的介词短语 ①修饰动词 ②修饰形容词 ③修饰其他副词 一、换一种方式理解词性 1、名词、形容词、副词&#xff0c…

揭开Markdown的秘籍:标题|文字样式|列表

🌈个人主页:聆风吟 🔥系列专栏:Markdown指南、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️Markdown 标题二. ⛳️Markdown 文字样式2.1 🔔斜体2.2 &…