- 抓大放小:知道如何得到正确结果而无需纠结具体原因
- 分类刷题
- 重构代码
- 罗马非一日建成(必不可急躁慌张,注重过程而不是结果)
- 勿在浮沙筑高楼
1. 函数
1.1 定义
1.2 使用
- 将数组作为函数参数
void fun(int *a)void fun(int a[])
- 将二维数组作为函数参数
返回值是char* ==> 返回一个字符串的首地址
2. 数组
2.1 定义
2.2 初始化和赋值:不初始化则数组中的数组均为随机值
- 初始化
//给长度,按位赋值,不够填0int a[10] = {0,1,2,3,4,5,6,7,8,9};int a[10] = {0,1};int a[10] = {0};//不给长度,自动得到长度int a[] = {0,1,2,3,4,5,6,7,8,9};
赋值
数组赋值:可用fill函数进行填充
a[i] = val;
#include <algorithm>fill(a,a+len,val);
数组和数组间的赋值
- 数组间不能直接赋值:但可用memcpy(b,a,sizeof(int)*k)
//memcpy(dst, src, 单元*k)#include <cstring>memcpy(a,b,sizeof(int)*k) //将数组b中的k个单元赋给数组a
- 数组间不能直接赋值:但可用memcpy(b,a,sizeof(int)*k)
2.3 使用
- a[i]
- 遍历
- 顺序
- 逆序
for(int i=0; i<len; i++) ===> i=len
for(int i=len-1; i>=0; i--) ===> i=-1
2.4 总结
- 较大的数组应声明在main外,main内无法开辟较大的数组(否则会异常退出)
- 数组越界:
- 数组不可开辟太小,一般设为100000+10(1e6+10)
- a[10]访问a[100]会自动退出(自动退出即:暂停不动几秒然后退出)
- cin >> i >> a[i] ==> error
2. 二维数组
2.1 定义
a[10][5]a[0],a[1]...a[9]
2.2 初始化和赋值
- 初始化
//直接给二维数组赋值
int a[10][5] = {1,2,3,4,5,...};
int a[10][5] = {1,2,3,4,5};
int a[10][5] = {0};
//给每个数组赋值
int a[10][5] = {{1},{2},{3}};
//不给行数,只给列数
int a[][5] = {1,2,3...}
int a[][5] = {{1},{2},{3}};
- 赋值:理解为数组的数组进行赋值即可
2.3 使用
理解为数组的数组即可
2. 字符数组
2. 字符串数组
3. 结构体
3.1 定义
3.2 初始化和赋值
- 初始化
- 赋值
student = {6, 150, true};
3.3 使用
4. 指针:从普通变量到指针变量
4.0 地址
- &a为a的地址
- 地址类型为int ,double …
4.1 定义:
指针的本质是地址
指针变量的本质是保存地址的变量
- 普通变量保存值
- 指针变量保存地址
4.2 初始化与赋值:
int *p = &a;
4.3 使用:*的本质是寻址
4.4 指针的应用:用指针操控所有的数据结构
4.4.1 指针与数组
- 数组名为数组首地址
a <=> &a[0] - **int p = a; 此时p与a等价
- a[i]
- p[i]
- *(p+i)
int* p = a; *(p+i) <==> a[i] p[i] <==> a[i]
4.4.2 指针与结构体
- p->element表示p指向的结构体中的element
struct student* p = &stu;
(*p).element <=> p->element
4.4.3 指针与函数
- 将指针作为函数参数传入,从而提高处理的效率
- 函数参数是变量==>调用时传入变量
- 函数参数是指针变量==>调用函数时传的是变量的地址
void fun1(int p);
void fun2(int* p);
int main()
{
fun1(i);
fun2(&i);
}
5. 指针的高级应用
**[] > ,从右向左结合
- int* p
- int p[10]:p[10] -> ==> 创建一个数组,每个数组元素是指针
- int (_p)[10]:*p -> _p[10] ==> 指向一维数组的指针
- int p:p -> ==> 创建一个指针,指向一个指针
- int (*p)(int, int):函数指针
- int *p(int, int):返回指针值的函数
5. 其他
6.1 强制类型转换
6.2 void*指针
6.3 动态内存分配
