假设需要向带有一个int参量的函数传递一个值,可以传递一个int变量,也可以传递一个int常量
C99之前的标准规定:数组参数的传递中,没有所谓的数组常量的概念
C99新增能够表示数组和结构内容的复合文字
数组声明:
int array[3] = {1, 2, 3}; // 普通数组的声明方法
(int [3]) {1, 2, 3}; // 复合文字,创建一个包含3个int值的无名称数组
// 初始化一个复合文字时可以省略数组大小,编译器会自动计算元素的数目
(int []) {1, 2, 3}; // 包含3个元素的符合文字
复合文字没有名称,不可能在一个语句中创建,而在另一个语句中使用;复合语句必须在创建的同时通过某种方法使用:例如使用指针保存其位置
int * p;
p = (int [3]) {1, 2, 3}; // 与数组名相同,文字常量同时代表其首元素的地址
复合文字也可以作为实际参数被传递给带有类型与之匹配的形参的函数
int sum(int arr[], int n);
...
int res;
...
res = sum((int []) {1, 2, 3, 4}, 4); // 这种给函数传递信息而不用先创建数组的方法
// 是复合常量的通常使用方法
示例代码:
#include <stdio.h>
#define COLS 4
int sum_2d(int arr[][COLS], int rows);
int sum_1d(int arr[], int n);
int main(void)
{
int res1, res2, res3;
int *p1;
int (*p2) [COLS];
p1 = (int [3]) {1, 2, 3};
p2 = (int [2][COLS]) {
{1, 2, 3, 4},
{5, 6, 7, 8}
};
res1 = sum_1d(p1, 3);
res2 = sum_2d(p2, 2);
res3 = sum_1d((int []) {6, 7, 8, 9}, 4);
printf("result 1 is %d\n", res1);
printf("result 2 is %d\n", res2);
printf("result 3 is %d\n", res3);
}
int sum_1d(int arr[], int n)
{
int i;
int temp = 0;
for(i = 0; i < n; i++)
{
temp += arr[i];
}
return temp;
}
int sum_2d(int arr[][COLS], int rows)
{
int i, j;
int temp = 0;
for(i = 0; i < rows; i++)
{
for(j = 0; j < COLS; j++)
{
temp += arr[i][j];
}
}
return temp;
}
运行结果:
数组和指针的总结
1)当需要存储同种类型的多个元素时,数组是最佳选择
2)C把数组归于派生类型,因为其建立在其他类型智商
3)使用数组名作为实参时,并不是把整个数组传递给函数,而是传递数组的地址,因此相应的形参是一个指针
4)处理数组时,函数必须知道数组的地址和元素的个数;数组地址直接传递给函数;数组元素的个数信息需要内建与函数内部或作为独立参数传递给函数;数组元素的个数信息作为独立参数传递时,函数可以处理不同大小的数组,通用性和适应性无疑更好
5)数组和指针紧密联系,指针符号和数组符号的运算往往可以互换使用;允许处理数组的函数使用指针作为形参
6)必须用一个常量表达式为传统的C数组指定其大小,因此在编译时数组大小已经确定;C99标准提供变长数组,数组的大小可以是变量,允许变长数组的大小在程序运行时才确定