03c_07day

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;
}