数组
数组是一种构造类型,是由基本类型构造而成。当我们想用一群变量来描述同一类相同的东西时候,比如100个年龄变量,我们可以这样int age1;int age2;int age3;……int age 100;这样即不方便书写,也不方便管理,此时数组就出现了,int age[100]就能搞定。
构造类型带来了书写和管理的方便。接下来我们要研究其定义,大小,初始化和访问。
2.1 基本语法
2.1.1 数组的使用(重点)
2.1.2 数组的初始化
- 在定义数组的同时进行赋值,称为初始化
- 全局数组若不初始化,编译器将其初始化为零
- 局部数组若不初始化,内容为随机值
凡是构造类型,要么在初始化的时候初始化, 要么对集合中的每个元素单独初始化。定义以后,不可以再以初始化的方式初始化。凡是基础数据类型,既可以在定义的时候初始化,也可以先定义后初始化。
2.1.3 数组名
- 数组名是一个地址的常量,代表数组中首元素的地址
- 一维数组在内存中是一组连续的存储空间。
2.2 数组案例
2.2.1 一维数组的最大值
2.2.2 一维数组的逆置
### 2.3 数组和指针
2.3.1 通过指针操作数组元素(重点)
- 数组名字是数组的首元素地址,但它是一个常量
- * 和 [] 效果一样,都是操作指针所指向的内存
1.数组名是一个常量,不允许重新赋值。
2.指针变量是一个变量,可以重新赋值。
3.p+i 和 array+i 均表示数组元素 array[i]的地址,均指向 array[i]
4.*(p+i)和*(array+i)均表示 p+i 和 array+i 所指对象的内容 array[i]。
5.*p++:等价于*(p++)。其作用:先得到*p,再使 p=p+1。
#include <stdio.h>
int main() {
int array[10] = { 1,2,3,4,65,6,12,13,14,15 };
int* p = &array;
printf("array=== %p\n", &array);
printf("p === %p\n", p);
int len = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < len; i++)
{
// array+i 和p+i 指向的都是地址 array[i]的地址
// *(array+i) 和*(p+i) 指向的内容 ====array[i]
// printf("arr[%d] = %d\n", i, array[i]);
// printf("arr[%d] = %d\n", i, *(array + i));
// printf("arr[%d] = %d\n", i, *(p + i));
// *(p++) == *p++ 先获取*p p=p+1
// printf("arr[%d] = %d\n", i, *(p++));
printf("arr[%d] = %d\n", i, *p++);
/* code */
}
return 0;
}
2.3.2 指针数组
- 指针数组,它是数组,数组的每个元素都是指针类型
2.3.3 数组名做函数参数
- 数组名做函数参数,函数的形参本质上就是指针
2.4 字符数组与字符串
2.4.1 字符数组与字符串区别(重点)
- C语言中没有字符串这种数据类型,可以通过char的数组来替代
- 数字0(和字符 ‘\0’ 等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组
如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组
2.4.2 字符指针(重点)
-
字符指针可直接赋值为字符串,保存的实际上是字符串的首地址
-
这时候,字符串指针所指向的内存不能修改,指针变量本身可以修改
2.4.3 字符串常用库函数
strlen
strcpy
strcat
strcmp
2.4.4 字符串案例
- 需求:自定义一个函数my_strlen(),实现的功能和strlen一样