专题4-7数组参数和指针参数分析(国嵌C语言视频)

来源:互联网 发布:特斯拉电磁塔升级数据 编辑:程序博客网 时间:2024/06/08 03:44
1. 思考
为什么C语言中的数组参

数会退化为指针?

退化的意义
C语言中只会以值拷贝的方式传递参数
当向函数传递数组时
 将整个数组拷贝一份传入函数
 将数组名看做常量指针传数组首元素地址
C语言以高效为最初设计目标,在函数传递的时
候如果拷贝整个数组执行效率将大大下降。

二维数组参数
二维数组参数同样存在退化的问题
 二维数组可以看做是一维数组
 二维数组中的每个元素是一维数组
二维数组参数中第一维的参数可以省略
void f(int a[5]);  void f(int a[]);  void f(int* a);
void g(int a[3][3]);  void g(int a[][3]);  void g(int (*a)[3]);


等价关系

数组参数                                        等效的指针参数
二维数组:char a[3][4]                  数组的指针:char (*a)[4]
指针数组:int* a[5]                       指针的指针:int** a
一维数组:float a[5]                      指针:float* a
                                   


注意事项
 C语言中无法向一个函数传递任意的多维数组
为了提供正确的指针运算,必须提供除第一维之外的
所有维长度
限制
 一维数组参数– 必须提供一个标示数组结束位置的长度信息
 二维数组参数– 不能直接传递给函数
 三维或更多维数组参数– 无法使用

#include <stdio.h>void access(int a[][3], int row){    int col = sizeof(*a) / sizeof(int);    int i = 0;    int j = 0;        printf("sizeof(a) = %d\n", sizeof(a));        for(i=0; i<row; i++)    {        for(j=0; j<col; j++)        {            printf("%d\n", a[i][j]);        }    }}int main(){    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};        access(a, 3);}




原创粉丝点击