c语言学习_part01_c_primer_plus_chapter010_数组与指针
-
初始化数组:
int a[3] = {1,2,3};
-
const修饰数组,不能修改数组中的值
const int a[3] = {1,2,3};
2. 多维数组
float rain[5][12]
包含5个数组元素,每个数组元素包含12个float类型的元素
3. 指针和数组
-
如果a是个数组,则以下语句成立:
a == &a[0]
a和&a[0]都表示数组首元素的内存地址,都是常量,在程序运行过程中都不会改变
-
指针+1表示的是增加一个存储单元,在数组中就是去下一个元素的地址,而不是下一个字节的地址
4. 指针操作
-
赋值:将地址赋值给指针,int* a = &...
-
解引用:*运算符求出指针指向地址上存储的值
-
取址:指针也有自己的地址,&运算符给出指针本身的地址
-
指针加或者减去整数:指针移位,数组元素移位
-
递增或者递减指针:指针移动一位,如果是数组,则指向数组中的下一个或前一个元素
-
指针求差:可以计算出两个元素之间的位置差,指针-指针=整数,指针-整数=指针
5. 保护数组中的数据
-
编写处理基本数据类型的函数时候,一般传递值,如果要对数值进行改变,则传递指针
-
处理数组时,必须传递指针,因为效率高,如果要值传递,需要对数组进行复制,浪费空间
-
因此用const修饰数组,告诉编译器不能修改数组内容
int sum(const int ar[], int n){ /*不可以修改ar中的值*/
int i;
int total = 0;
for(i = 0; i < n; i++){
total += ar[i];
}
return total;
} -
const作用:const修饰的变量是只读的,不能修改
-
修饰数组:数组中的元素不可以被修改
const int days[3] = {1, 2, 3} /*days中元素不能被修改*/
-
指向const的指针:用指针法表示数组,数组中元素一样不能改变
int days[3] = {1, 2, 3};
const int* pd = days; /*pd指向数组的首元素*/
*pd = 10; /*不允许*/
days[0] = 10; /*允许,因为days没有被const修饰*/
pd++; /*允许,pd可以指向别的地方*/ -
修饰指针:指针不能指向别的地方
int days[3] = {1, 2, 3};
int* const pd = days;
*pd = 10; /*允许*/
days[0] = 10; /*允许,因为days没有被const修饰*/
pd++; /*不允许,pd不可以指向别的地方*/ -
用两次const:指针既不能指向别的地方,也不能修改指向地址的值
int days[3] = {1, 2, 3};
const int* const pd = days;
*pd = 10; /*不允许*/
days[0] = 10; /*允许,因为days没有被const修饰*/
pd++; /*不允许,pd不可以指向别的地方*/
-
6. 指针和多维数组
int a[5][2];
a; /*二维数组的首元素地址,每个元素是包含两个int型元素的一维数组*/
a+1; /*二维数组的第二个元素(一维数组)的地址*/
*(a+2); /*二维数组的第三个元素(一维数组)的首元素地址*/
*(a+2)+1; /*二维数组的第三个元素(一维数组)的第二个元素(int型值)地址*/
*(*(a+2)+1); /*二维数组的第三个元素(一维数组)的第二个元素(int型值)的值,即数组中的第三行第二个元素值a[2][1]*/
-
指针数组:包含指针的数组
int* a[2]; /*a是包含两个指针元素的数组,指针元素指向int类型*/
-
数组指针:指向数组的指针
int (* a)[2]; /*a指向一个包含两个int类型数据的数组*/
-
变长数组中的变不是说可以改变数组的大小。一旦创建了变长数组,大小会保持不变。这里的变是指:创建数组时,可以使用变量指定数组维度
int sum(int r, int c, int ar[r][c]){
int row;
int col;
int tot = 0;
for(row = 0; row < r; row++){
for(col = 0; col < c; c++){
tot += ar[row][col];
}
}
return tot;
}