C语言学习笔记--数组参数和指针参数

时间:2021-07-20 15:00:26

1. 数组参数退化为指针的意义

(1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的。

(2)参数位于栈上,太大的数组拷贝将导致栈溢出。

(3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组。

2. 二维数组参数

(1)二维数组参数同样存在退化的问题:

二维数组可以看做是一维数组,其中的每个元素又是一个一维数组

(2)二维数维参数中第一维的参数可以省略

①void f(int a[5])←→void f(int a[])←→void f(int* a)

②void g(int a[5][3])←→void g(int a[][3])←→void g(int (*a)[3]);

(3)等价关系

数组参数

等效的指针参数

备注

一维数组:float a[5]

指针:float* a

相当于数组去掉第1维,然后把数组名前加上*。

指针数组:int* a[5]

指针的指针:int** a;

二维数组:char a[3][4]

数组的指针:char(*a)[4]

(4)被忽视的知识点

①C 语言中无法向一个传递任意多维数组。换一句话讲,形参 int a[][3]是合法的,但 inta[][]是非法的。

①因此,必须提供除第 1 维之外的所有其他维长度。第一维之外的维度信息用于完成指针运算。

传递与访问二维数组

#include <stdio.h>

void access(int a[][],int row) //a[][3],形参第2维的长度必须提供
{
int col = sizeof(*a)/sizeof(int); int i = ;
int j = ; printf("sizeof(a) = %d\n",sizeof(a)); //指针,4字节 //a为int (*a)[3]类型,即a指向一个有3个int型元素的数组
printf("sizeof(*a) = %d\n",sizeof(*a));//3*4 =12字节 for(i = ;i < row; i++)
for(j = ; j < col; j++)
{
printf("%d\n", a[i][j]);
} printf("\n");
} void access_ex(int b[][][],int n) //数组参数的第2、3维长度必须提供
{
int i = ;
int j = ;
int k = ; printf("sizeof(b) = %d\n",sizeof(b)); //指针,4字节 //b为int (*b)[2][3]类型,即b指向一个有2行3列int型元素的二维数组
printf("sizeof(*b) = %d\n",sizeof(*b));//2 * 3 * 4 = 24字节 for(i = ;i < n; i++)
for(j = ; j < ; j++)
for(k = ; k < ; k++)
{
printf("%d\n", b[i][j][k]);
} printf("\n");
} int main()
{
int a[][] = {{, , },{, , },{, , }};
int aa[][] = {};
int b[][][] = {}; access(a, );
//access(aa,2);//error,int(*)[2]与int (*)[3]类型不匹配 access_ex(b, );
//access_ex(aa,2);//int(*)[2]与int(*)[2][3]类型不匹配 return ;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html