• 抓大放小:知道如何得到正确结果而无需纠结具体原因
  • 分类刷题
  • 重构代码
  • 罗马非一日建成(必不可急躁慌张,注重过程而不是结果)
  • 勿在浮沙筑高楼

1. 函数

1.1 定义

1.2 使用

  • 将数组作为函数参数
  1. void fun(int *a)
  2. void fun(int a[])
  • 将二维数组作为函数参数

返回值是char* ==> 返回一个字符串的首地址

2. 数组

2.1 定义

2.2 初始化和赋值:不初始化则数组中的数组均为随机值

  • 初始化
  1. //给长度,按位赋值,不够填0
  2. int a[10] = {0,1,2,3,4,5,6,7,8,9};
  3. int a[10] = {0,1};
  4. int a[10] = {0};
  5. //不给长度,自动得到长度
  6. int a[] = {0,1,2,3,4,5,6,7,8,9};
  • 赋值

    • 数组赋值:可用fill函数进行填充

      1. a[i] = val;
      1. #include <algorithm>
      2. fill(a,a+len,val);
    • 数组和数组间的赋值

      • 数组间不能直接赋值:但可用memcpy(b,a,sizeof(int)*k)
        1. //memcpy(dst, src, 单元*k)
        2. #include <cstring>
        3. memcpy(a,b,sizeof(int)*k) //将数组b中的k个单元赋给数组a

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 动态内存分配