==========================
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 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));
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)); }
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;
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;
for(i = 0; i < sizeof(arr) / sizeof(arr[0]); 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;
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); }
int main(int argc, char *argv[]) { int arr[5] = {11,22,33,44,55}; int size = sizeof(arr) / sizeof(arr[0]);
print(arr, size); change(arr, size); print(arr, size);
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; }
|