C Primer Plus 摘录

第 10 章 数组和指针

10.1 数组

float candy[365];
char code[12];
int states[50];

10.1.1 初始化数组

int powers[8] = {1,2,4,6,8,16,32,64};
const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31 };

10.1.2 指定初始化器(C99)

int arr[6] = {0,0,0,0,0,212}; // 传统的语法
int arr[6] = {[5] = 212}; // 把arr[5]初始化为212
int days[MONTHS] = { 31, 28, [4] = 31, 30, 31, [1] = 29 };

10.1.3 给数组元素赋值

10.1.4 数组边界

10.1.5 指定数组的大小

int n = 5;
int m = 8;
float a1[5]; // 可以
float a2[5*2 + 1]; //可以
float a3[sizeof(int) + 1]; //可以
float a4[-4]; // 不可以, 数组大小必须大于0
float a5[0]; // 不可以, 数组大小必须大于0
float a6[2.5]; // 不可以, 数组大小必须是整数
float a7[(int)2.5]; // 可以, 已被强制转换为整型常量
float a8[n]; // C99之前不允许
float a9[m]; // C99之前不允许

10.2 多维数组

float rain[5][12]; // 内含 5 个元素的数组, 每个元素本身是一个内含12个 float 类型值的数组

【C Primer PLus 摘录】第 10 章 数组和指针(未完)

10.2.1 初始化二维数组

sometype ar1[5] = {val1, val2, val3, val4, val5};
const float rain[5][12] =
{ 
    {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
    {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
    {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
    {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
    {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
};
// 使用了 5 个数值列表(花括号括起来),逗号分隔来初始化二维数组
// 第一个列表初始化第一个元素,依次类推。

【C Primer PLus 摘录】第 10 章 数组和指针(未完)

10.2.2 其他多维数组

10.3 指针和数组

数组名是数组首元素的地址

【C Primer PLus 摘录】第 10 章 数组和指针(未完)

dates + 2 == &date[2] // 相同的地址
*(dates + 2) == dates[2] // 相同的值

明白了数组和指针的关系, 便可在编写程序时适时使用数组表示法或指针表示法

指针表示法和数组表示法是两种等效的方法。编译器编译这两种写法生成的代码相同。

10.4 函数、 数组和指针

第1个形参告诉函数该数组的地址和数据类型, 第2个形参告诉函数该数组中元素的个数

int sum(int* ar, int n);
int sum (int ar[], int n);
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);

10.4.1 使用指针形参

还有一种方法是传递两个指针, 第1个指针指明数组的开始处(与前面用法相同) , 第2个指针指明数组的结束处。

int sump(int* start, int* end)
{
    int total = 0;
    while(start < end)
    {
        total += *start;// 把数组元素的值加起来
        start++;
    }
    return total;
}
// 因为下标从0开始, 所以 marbles + SIZE 指向数组末尾的下一个位置。
answer = sump(marbles, marbles + SIZE);

10.5 指针操作

指针变量的 9 种基本操作

指针的第 1 个基本用法是在函数间传递信息。前面学过, 如果希望在被调函数中改变主调函数的变量, 必须使用指针。 指针的第 2 个基本用法是用在处理数组的函数中。