一、数组
声明一个简单的一维数组形式如下:
type name [ size ];
对于 C 语言而言,不能把整个数组作为参数传递给函数,但是可以传递数组的地址。
然后函数可以使用传入的地址操控原始数组。
如果函数没有修改原始数组的意图,应在声明函数的形式参数时使用关键字const。
如何修改原始数组:在被调函数中可以使用数组表示法或指针表示法,无论用哪种表示法,实际上使 用的都是指针变量。
二维数组即是数组的数组,下面声明了一个二维数组:
double sales[5][12];
该数组名为sales,有5个元素(一维数组),每个元素都是一个内含12 个double类型值的数组。
二、指针
数组和指针的关系
实际上,C 语言标准在描述数组表示法时确实借助了指针。
也就是说,定义ar[n]的意思是*(ar + n)。
可以认为*(ar + n)的意思是“到内存的ar位置,然后移动n个单 元,检索储存在那里的值”。
顺带一提,不要混淆 *(dates+2)和*dates+2。
间接运算符(*)的优先级 高于+,
所以*dates+2相当于(*dates)+2:
*(dates + 2) // dates第3个元素的值
*dates + 2 // dates第1个元素的值加2
三、复习题
1.正确声明以下各变量(定义数组):
a.digits是一个内含10个int类型值的数组
int digits[10]
b.rates是一个内含6个float类型值的数组
float rates[6]
c.mat是一个内含3个元素的数组,每个元素都是内含5个整数的数组
int mat[3][5]
d.psa是一个内含20个元素的数组,每个元素都是指向int的指针
int *psa[20]
e.pstr是一个指向数组的指针,该数组内含20个char类型的值
char (*pstr)[20]
2.正确声明以下各变量(为数组赋值):
a.声明一个内含6个int类型值的数组,并初始化各元素为1、2、4、8、 16、32
a.int sextet[6] = {1, 2, 4, 8, 16, 32};
b.用数组表示法表示a声明的数组的第3个元素(其值为4)
b.sextet[2]
c.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组, 并初始化最后一个元素为-1,其他元素不考虑
c.int lots[100] = { [99] = -1};
d.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组, 并初始化下标为5、10、11、12、13的元素为101,其他元素不考虑
d.int pots[100] = { [5] = 101, [10] = 101,101, 101, 101};