您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页C语言 ——指针数组与数组指针

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

来源:叨叨游戏网


一、二维数组

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

二维数组 :

int arr [ 3 ][ 5 ]  

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

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

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

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

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

二、指针数组

(1)概念

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

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

 (2)书写方式

int*parr[6]:

parr 数组名

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

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

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用 int * 进行表示 而&arr则用 int(*)[10]表示。

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

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

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

 

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

下图的写法更适合大众。

 (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)//传参调用

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

 随即可以演化为:

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};

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

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

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

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

而在中,我们得知了一种写法,arr[ i ] 可以写为*(arr+i)其中arr表示为数组名。

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

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务