0%

03c_07day

==========================
2022-7-22
==========================

一.温故知新

    函数 : 就是一个功能
    函数的声明
函数的返回值类型 函数名(参数列表);//形式参数
    函数的实现
函数的返回值类型 函数名(参数列表)//形式参数
{
    功能的实现
}
    函数的调用
函数名(参数);//实际参数

值传递	:

地址传递:

    二级指针
    用来保存一级指针的地址
    可以通过二级指针操控一级指针
    type **	pointer_name;
    int **pp;->pp++->偏移量和int *
    char **pp;->pp++->偏移量和char *

数组(arr/array)

1.什么是数组?
    相同类型变量的集合
    数组是由一个一个成员组成,每个成员的数据类型都是相同的
2.数组的含义
    数组就是用来存储一组相同类型的数据的
3.数组的定义
    数据类型	数组名	[成员个数]	;
    int			arr		[5]			;
    char		brr		[20]		;
    float		crr		[3]			;
    1)数组的定义中数据类型->指的是数组的每个成员的类型
    2)数组名的命名规则和变量的命名规则一致
    3)成员个数->就是数组的成员个数
    注意 : 成员个数必须是一个非负的整数
4.访问数组成员的方法
    例子 : int arr[5];//定义了有5个int类型成员的数组arr
            int *p = arr;
    1)数组名 + 下标//在访问成员时下标从0开始计数
        arr[0] arr[1] arr[2] arr[3] arr[4]
        注意 : 没有arr[5]这个成员,如果强行使用arr[5]成员,
            会造成数组越界
    2)数组名 + 偏移量
        *(arr+0) *(arr+1) *(arr+2) *(arr+3) *(arr+4)
    3)指针 + 偏移量
        *(p + 0) *(p + 1) *(p + 2) *(p + 3) *(p + 4)
    4)指针 + 下标
        p[0] p[1] p[2] p[3] p[4]
5.数组的特性
    1)通过sizeof运算符查看数组特性
        sizeof(数组名) = 整个数组的大小
        sizeof(成员) = 一个成员的大小
        sizeof(数组名) / sizeof(成员) = 成员个数
    2)数组中成员的地址都是连续的
        可以通过某个成员的地址进行地址偏移
            找到其他成员的位置
    3)一维数组的数组名表示的是数组首成员的地址
6.数组的初始化
    数据类型	数组名	[成员个数]	=	{数值,数值};
    int			arr		[3]			=	{0,1,2];
    int			arr		[3]			=	{0};
            //会把数组的所有成员初始化成0
    int			arr		[3]			=	{11};
            //会把首成员初始化成11,其他成员初始化成0
    ================================================
    int			arr		[]			=	{11,22,33,44};
            //会把后边数值的个数当作成员个数使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5];

arr[0] = 100;
arr[1] = 9527;
arr[2] = -1;
arr[3] = 123;
arr[4] = 10086;

printf("arr[0] = %d\n", arr[0]);
printf("arr[1] = %d\n", arr[1]);
printf("arr[2] = %d\n", arr[2]);
printf("arr[3] = %d\n", arr[3]);
printf("arr[4] = %d\n", arr[4]);

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
//int arr[5];可以
//int arr[0];可以
//int arr[-1];不可以
//int arr[3.14];不可以
//int arr['A'];可以
int i = 5;
int arr[i];

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5];
int i = 0;

for(i = 0; i < 10; i++)
{
arr[i] = i * 10;
printf("arr[%d] = %d\n", i, arr[i]);
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5];
int i = 0;

for(i = 0; i < 5; i++)
{
scanf("%d", &arr[i]);
}

for(i = 0; i < 5; i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5];
int i = 0;

printf("sizeof(arr[0]) = %ld\n", sizeof(arr[0]));
printf("sizeof(arr) = %ld\n", sizeof(arr));


/*for(i = 0; i < 5; i++)
{
printf("sizeof(arr[%d]) = %ld\n", i, sizeof(arr[i]));
}*/

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[10];
int i = 0;

for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
scanf("%d", &arr[i]);
}

for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i = 10;
int arr[5] = {i};

printf("arr[0] = %d\n", arr[0]);
printf("arr[1] = %d\n", arr[1]);
printf("arr[2] = %d\n", arr[2]);
printf("arr[3] = %d\n", arr[3]);
printf("arr[4] = %d\n", arr[4]);

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i = 0;
int arr[5] = {0};

for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("arr[%d] = %p\n", i, &arr[i]);
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5] = {0};

printf("arr[0] = %p\n", &arr[0]);
//表示的是数组首成员的地址
printf("arr = %p\n", arr);
//表示的是数组首成员的地址
printf("&arr = %p\n", &arr);
//表示的是整个数组的地址
printf("===========================\n");
printf("arr[0] + 1 = %p\n", &arr[0] + 1);
printf("arr + 1 = %p\n", arr + 1);
printf("&arr + 1 = %p\n", &arr + 1);

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5] = {11,22,33,44,55};
int i = 0;

for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
//printf("arr[%d] = %d\n", i, arr[i]);
printf("*(arr + %d) = %d\n", i, *(arr + i));
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5] = {11,22,33,44,55};

printf("arr = %p\n", arr);

arr += 1;
//arr++;

printf("arr = %p\n", arr);

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5] = {11,22,33,44,55};
int i = 0;
int *p = arr;

//p = &arr[0];//把数组首成员的地址赋值给指针p
p = arr;//把数组首成员的地址赋值给指针p

for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
//printf("arr[%d] = %d\n", i, arr[i]);
//printf("*(arr + %d) = %d\n", i, *(arr + i));
//printf("*(p + %d) = %d\n", i, *(p + i));
//printf("p[%d] = %d\n", i, p[i]);
printf("%d[arr] = %d\n", i, i[arr]);
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[5] = {11,22,33,44,55};
int *p = arr;

/*
sizeof(arr) / sizeof(arr[0]) = 5
sizeof(arr) / sizeof(*arr) = 5
sizeof(p) / sizeof(*p) = 2
sizeof(p) / sizeof(p[0]) = 2
*/

return 0;
}

数组和函数

1.当多函数程序需要使用数组传参时,
    无论是否需要修改数组成员的值,在函数调用时都传数组名
2.如果功能函数并不想修改实参数组成员的值,
    可以在形参前加const关键字修饰一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>

void print(const int *p, int size);
void change(int *p, int size);

void print(const int *p, int size)
{
int i = 0;

for(i = 0; i < size; i++)
printf("p[%d] = %d\n", i, p[i]);
}

void change(int *p, int size)
{
int i = 0;

for(i = 0; i < size; i++)
scanf("%d", p + i);//&p[i]
}

int main(int argc, char *argv[])
{
int arr[5] = {11,22,33,44,55};
int size = sizeof(arr) / sizeof(arr[0]);

print(arr, size);//通过print函数遍历数组的成员

change(arr, size);//通过change函数改变数组成员的值

print(arr, size);//通过print函数遍历数组的成员

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>

int *func(void);

int *func(void)
{
int arr[5] = {11,22,33,44,55};//局部数组

return arr;
}

int main(int argc, char *argv[])
{
int *p = NULL;
int i = 0;

p = func();

for(i = 0; i < 5; i++)
{
printf("p[%d] = %d\n", i, p[i]);
}

return 0;
}