数组作与指针做参数比较
2007-05-13 21:10
211 查看
数组作与指针做参数比较
C语言中的数组可分为一维数组和多维数组两类,而多维数组中又以二维数组最为常见。这里也仅针对这一维数组和二维数组作简要说明。
高质量C++编程指南中指出当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针,这句话针对一维数组是正确的(目前个人认为是正确的),但是对于多维数组,这显然不完全正确。C语言之所以把数组形参当作指针是出于效率考虑,如果把一个数组全部拷贝这样势必带来性能上的损失,如果数组很大的话,这种完全拷贝的方法就是不能忍受的了。所以目前无论你在函数声明中像'void func1(char a[])'这样写,还是像'void func1(char *a)',编译器都会把它看成后者的形式。
所以对于一个常考的笔试题目:
Void f(char a[])
{
Cout<<sizeof(a)<<endl;
}
输出结果自然就是4.(默认指针占4位,后面都以此为标准)
对于二维数组情况,二维数组可以表示为多种形式:
(1) char a[m]
-- 标准形式;
(2) char *p
-- 指针数组形式;
(3) char (*p)
-- 数组(行)指针的形式
(4) char **p -- 指针的指针的形式
这些形式虽然都能表示二维数组,但是它们并不等价,二维数组作为参数后的转化还是有原则可循的。就是使得在子函数中仍然可以识别出数组行的长度。
(1) char a[m]
-- void func(char (*p)
); 也可以写成void func(char p[]
)(编译器自动将char p[]
翻译为char (*p)
),所以这个时候sizeof(p)=4;sizeof(*p)为n;//注意不是4哈。。。
(2) char *a
-- void func(char *p[]);也可以写成void func(char **p) ,这个时候sizeof(p)=4,sizeof(*p)=4;
(3) char (*a)
-- void func(char (*p)
);这个时候sizeof(p)=4,sizeof(*p)=n;
(4) char **a -- void func(char **p);
其实2是一维数组的情况,3是一维数组指针,4是二级指针传递。
上面的*和[]可以互换的,写成p[]的情况可以换为*p,*p可以换为p[],
当可以写为p[]的情况下,在[]中写入任何数情况下都不会对程序构成影响。编译器会将这种情况都转换为*p的情况。
总的原则就是,当你把数组名传入是必须让计算机可以识别出行的长度(数组为二维的情况下)。三维的情况类似,找到规律,所有情况都可以迎刃而解。
注:上面列举的所有情况均在vc6.0下测试通过。
C语言中的数组可分为一维数组和多维数组两类,而多维数组中又以二维数组最为常见。这里也仅针对这一维数组和二维数组作简要说明。
高质量C++编程指南中指出当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针,这句话针对一维数组是正确的(目前个人认为是正确的),但是对于多维数组,这显然不完全正确。C语言之所以把数组形参当作指针是出于效率考虑,如果把一个数组全部拷贝这样势必带来性能上的损失,如果数组很大的话,这种完全拷贝的方法就是不能忍受的了。所以目前无论你在函数声明中像'void func1(char a[])'这样写,还是像'void func1(char *a)',编译器都会把它看成后者的形式。
所以对于一个常考的笔试题目:
Void f(char a[])
{
Cout<<sizeof(a)<<endl;
}
输出结果自然就是4.(默认指针占4位,后面都以此为标准)
对于二维数组情况,二维数组可以表示为多种形式:
(1) char a[m]
-- 标准形式;
(2) char *p
-- 指针数组形式;
(3) char (*p)
-- 数组(行)指针的形式
(4) char **p -- 指针的指针的形式
这些形式虽然都能表示二维数组,但是它们并不等价,二维数组作为参数后的转化还是有原则可循的。就是使得在子函数中仍然可以识别出数组行的长度。
(1) char a[m]
-- void func(char (*p)
); 也可以写成void func(char p[]
)(编译器自动将char p[]
翻译为char (*p)
),所以这个时候sizeof(p)=4;sizeof(*p)为n;//注意不是4哈。。。
(2) char *a
-- void func(char *p[]);也可以写成void func(char **p) ,这个时候sizeof(p)=4,sizeof(*p)=4;
(3) char (*a)
-- void func(char (*p)
);这个时候sizeof(p)=4,sizeof(*p)=n;
(4) char **a -- void func(char **p);
其实2是一维数组的情况,3是一维数组指针,4是二级指针传递。
上面的*和[]可以互换的,写成p[]的情况可以换为*p,*p可以换为p[],
当可以写为p[]的情况下,在[]中写入任何数情况下都不会对程序构成影响。编译器会将这种情况都转换为*p的情况。
总的原则就是,当你把数组名传入是必须让计算机可以识别出行的长度(数组为二维的情况下)。三维的情况类似,找到规律,所有情况都可以迎刃而解。
注:上面列举的所有情况均在vc6.0下测试通过。
相关文章推荐
- 数组作与指针做参数比较
- 数组作与指针做参数比较
- C++中的指针、数组作为参数
- 修改程序清单7.7中的3个数组处理函数,使之使用两个指针参数来表示区间.
- 数组的下标访问和指针访问方式效率分析比较
- 作为参数的数组实际上是指针
- 数组、指针作为函数参数
- 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 二十六、数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
- C++编程入门系列之二十六(数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数)
- C语言之数组专题:数组指针、指针数组、数组做函数参数退化、数组名、数组类型
- 定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同打印G
- 定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同打印G
- 字符串数组排序(qsort参数 比较函数)
- 数组与指针——参数
- 指针之函数的参数是数组的时候的本质
- Labview调用dll参数设置:结构体、指针、数组、簇
- 《C专家编程》笔记三:数组和指针实参所对应的形式参数
- 数组和指针作为函数参数——高质量C、C++编程指南