C语言 ——指针数组与数组指针

这篇具有很好参考价值的文章主要介绍了C语言 ——指针数组与数组指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、二维数组

二、指针数组

(1)概念

 (2)书写方式

(3)指针数组模拟二维数组

三、数组指针

(1)概念

(2)使用数组指针打印一维数组

 (3)模拟二维数组的传参


一、二维数组

首先,我们要理解一下二维数组和指针变量之间的一些相关概念。

二维数组 :

int arr [ 3 ][ 5 ]  

和一维数组一样,在内存中是一个连续存放的,且每一个元素之前相差的字节是一致的,列如在x86的环境中,二维数组中每一个相邻的元素之间相差4个字节。

不过由于二维数组的特殊性,我们通常把二维数组打印成矩阵形式。

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

但又和一维数组不同,一维数组的首地址是它首元素的地址,而二维数组的首地址是首行的地址。

二维数组的每一行是一个一维数组,这个一维数组可以看做是二维数组的一个元素。

所以二维数组也可以认为是一维数组的数组。

那么 int arr[3][5] 看成一维数组那么数组名就是 arr[3]。

二、指针数组

(1)概念

首先,指针数组是一个数组,在数组中寄存的是同一类型的指针变量,或者说是地址。

就像整型数组,在整型数组内寄存的是整型的变量,字符数组在字符数组内寄存的是字符类型的变量。

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 而指针变量的类型具有很多,int* 、char*、short*…………所以,指针数组也有着许多不同的类型。

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 (2)书写方式

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

int*parr[6]:

parr 数组名

int* 表示的是数组内寄存的地址指向的元素的类型是int,而也使得这些地址的类型也便是int*

[6]表示的是指针数组的大小。

(3)指针数组模拟二维数组

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 其中,arr1、arr2、arr3表示的是数组名,而数组名又表示数组首元素的地址,相当于指针。

int * 表示的是指针数组内,那些指针变量的类型。

而因为二维数组的特性,parr[ i ]可以表示为数组名。

而数组名的另一种写法 即为 *(arr+i) 其中arr表示为数组名 ,i表示为遍历。

又因为 parr[ i ] == *( parr + i )

所以parr[ i ][ j ]的另一种写法:*( *(parr+i)+ j ) 其中*(parr+i)为数组名,j为遍历

三、数组指针

(1)概念

首先要认识到,我们之前学习指针数组,指针数组是数组,是存放指针的数组。

数组指针,是指向数组的指针,存放的是数组的地址 。

例如:

int arr[10]; 

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

在此之前,我们先理解一下数组的地址:

通过一维数组的学习,我们得知arr表示的数组名,又表示为数组首元素的地址,而&arr表示的则是整个数组的地址。

随后,紧接着我们的指针知识,我们可以将arr用 int * 进行表示 而&arr则用 int(*)[10]表示。

而如上所示,指针变量p中存储的是整个数组的地址。

也正是如此,我们得知 数组指针变量p的类型是 int (*)[10] 

而 int (*)[10] 同时也是 p的数组指针类型。

(2)使用数组指针打印一维数组

 C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 (*p)[ i ] 其中(*p)可以表示为数组名,缘由是&arr = int (*p)[10]  整个数组的地址都交予了指针变量p 相当于p就是&arr 而进行换算 (*p)= (*&arr)其中的*和&是相互抵消的,所以(*p)相当于数组名。

不够以上这种写法并不推荐。

下图的写法更适合大众。

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 (3)模拟二维数组的传参

假设:

int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};

以上是一个二维数组,当二维数组需要进行调用传参时,我们是需要将它的行数和列数一并进行传参的。

test(arr,3,5)//传参


void test (int arr[3][5],int r,int c)//传参调用

而,在使用数组指针进行模拟二维数组传参的同时,我们要明白一个知识。

二维数组的首地址是首行的地址,二维数组是由一维数组组成的。

或者可以说,二维数组的每一行,可以表示为一个一维数组的数组地址。

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针

 随即可以演化为:

int arr0[5] = {1,2,3,4,5};

int arr1[5] = {2, 3, 4, 5, 6};

int arr2[5] = {3, 4, 5, 6, 7}; 

int arr3[] = {&arr0, &arr1, &arr2};

&arr0、&arr1、&arr2 分别表示为二维数组arr[ 3 ][ 5 ] 中的每一行的数组地址。

而我们又知道,二维数组arr[ 3 ][ 5 ] 其中arr[ 3 ]相当于一个数组名。

所以,传参调用可以写为:

void test ( int(*arr)[ 5 ], int r, int c )//传参调用

(* arr )[ 5 ] 相当于不久之前的(*p)[ i ],将二维数组的每一行当作一个一维数组,,而arr和p都为整个一维数组的地址,则二者的意思相同。

而不同的是,(* arr )表示的是第一行的地址,在进行打印时需要在内部加上遍历以至于抵达第二行第三行的地址。

所以,*(arr+i) 表示的是数组名,表示arr[ i ][ j ] 中的 arr[ i ] 

而在http://t.csdn.cn/c6Q6H中,我们得知了一种写法,arr[ i ] 可以写为*(arr+i)其中arr表示为数组名。

因此带入到本次模拟中,arr[ i ][ j ]我们可以写为 *(*(arr+i)+ j ) 其中的*(arr+i)和arr[ i ]是数组名。

最后本次二维数组的传参模拟可以写为:

C语言 ——指针数组与数组指针,C语言,c语言,算法,数据结构,指针文章来源地址https://www.toymoban.com/news/detail-644313.html

到了这里,关于C语言 ——指针数组与数组指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c语言指针详解】复杂数据结构的指针用法

    目录 一、动态内存分配 1.1 使用malloc和free函数进行内存的动态分配和释放 1.2 内存泄漏和野指针的概念和解决方法 二、复杂数据结构的指针用法 2.1 结构体指针和成员访问操作符 2.2 指针数组和指向指针的指针 2.2.1 指针数组 2.2.2 指向指针的指针 2.3 动态内存分配与结构体

    2024年02月04日
    浏览(38)
  • 【数据结构与算法】之多指针算法经典问题

    本文为 【数据结构与算法】多指针算法经典问题 相关介绍,下边将对 链表反转 (包含 迭代反转链表 、 递归反转 、 头插法反转 ), 双指针-快慢指针 (包含 寻找单向无环链表的中点 、 判断单向链表是否有环及找环入口 ), 双指针-左右指针 (包含 两数之和 、 二分查

    2024年02月03日
    浏览(31)
  • C语言自定义数据类型(三)结构体指针

    所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。 目录 一、指向结构体变量的指针 1.1举例说明 二、指向结构体数组的指

    2024年02月06日
    浏览(33)
  • 数据结构与算法----复习Part 8 (链表双指针)

    本系列是算法通关手册LeeCode的学习笔记 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 本系列为自用笔记,如有版权问题,请私聊我删除。 目录 一,双指针简介(Two Pointers) 二,起点不一致的快慢指针 三,步长不一致的快慢指针 判断链表中是否含有环: 四

    2024年02月19日
    浏览(36)
  • 手撕数据结构与算法——树(三指针描述一棵树)

    📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段, 因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力 ——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:king南星 📖

    2024年01月17日
    浏览(39)
  • C语言数据结构一:动态数组

    先说一个概念:数组是一段 连续 的内存空间。存储相同的数据类型。 数组的两个关键点: 连续内存; 相同类型。 首先连续内存:所以为了找到动态数组我们必须找到一个 首元素 地址。(内存 首地址 。) 如果不知道首地址,那无法找到并操作内存空间。 知道首地址了,

    2024年02月06日
    浏览(35)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 树状数组 (Binary Indexed Tree,BIT)是一种数据结构,用于高效地处理

    2024年03月11日
    浏览(51)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法、数据结构~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 数据结构各内部排序算法总结对比及动图演示(插入排序

    2024年03月26日
    浏览(75)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(35)
  • 数据结构与算法(一): 稀疏数组

    在五子棋游戏或类似的游戏中,我们可以把整个棋盘想象成是一个有规律的二维数组,其值由0、1、2三个数字组成,0代表空白区域,1代表白子,2代表黑子。这种情况:即当一个数组中大部分元素为0或者为同一值时,存储该数组数据可以使用稀疏数组来对原始数组进行精简,

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包