1.指针是什么?
1.1概念
1.2指针的大小
指针在32位平台是4个字节,在位平台是8个字节
1.3指针类型的意义
1.指针类型决定了指针进行解引用操作时,能够访问空间的大小。当
int* p; p能够访问4个字节
char p; p能够访问1个字节
double p; *p能够访问8个字节
int * 可以访问4个字节的空间,如图所示:
2.野指针
概念:野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确的)
2.1野指针产生的原因
1.指针未被初始化
2.2如何规避野指
1.指针变量初始化,把指针变量赋值成空指针
2.小心指针越界
3.指针 指向的空间释放时要制成空指针
4.指针使用之前检查其合法性
3.指针运算
3.1指针±整数
result:1 2 3 4 5 6 7 8 9 10
3.2指针-指针
指针 - 指针(大指针 - 小指针)是两个指针间元素的个数。
前提:两个指针必须指向同一个内存空间
4.字符指针
5.指针和数组
5.1数组名
5.2指针数组
概念:首先它是一个数组,是用来存放指针变量的,每个元素是一个指针。
5.3数组指针
概念:指向数组的指针,它本质是一个指针。
注释:
int (*p)[10];
数组传参的两种方式:
1.比如一个二维数组 arr[3][5],首先通过函数传入arr,在子函数中拿int arr[3][5]接收。
1.比如一个二维数组 arr[3][5],首先通过函数传入arr,在子函数中拿int (*p)[5] (数组指针)接收。
遍历一维数组的多种写法
遍历二维数组的多种写法
6.数组参数,指针参数
6.1一维数组传参
一维整型数组传参的三种方式:
void test(int arr[])
{
}
void test(int arr[10])
{
}
void test(int *arr)
{
}
int main()
{
int arr[10] = {0};
test(arr);
}
一维指针数组传参的三种方式:
void test2(int* arr[20])
{
}
void test2(int* *arr2)
{
}
int main()
{
int* arr2[20] = {0};
test2(arr2);
}
6.2二维数组传参
void test(int arr[3][5])
{
}
void test(int arr[][5])
{
}
void test(int (*arr)[5])
{
}
int main()
{
int arr[3][5] = {0};
test(arr);
return 0;
}
6.3指针传参
6.4二级指针传参
7.函数指针
概念:存放函数指针类型元素的数组通俗的说是指向函数的指针。
8.函数指针数组
概念:存放函数指针类型元素的数组
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x * y;
}
int main()
{
int(*parr[4])(int, int) = { Add, Sub, Mul, Div };
int i;
for (i = 0; i < 4; i++)
{
printf("%d\n", parr[i](2, 3));
}
return 0;
}
应用:计算器
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("************************\n");
printf("*** 1.Add 2.Sub ****\n");
printf("*** 3.Mul 4.Div ****\n");
printf("******** 0.exit *****\n");
printf("************************\n");
};
int main()
{
int input;
int x;
int y;
int(*pfArr[])(int, int) = { 0, Add, Sub, Mul, Div };
do {
menu();
printf("请选择:>\n");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个数:>\n");
scanf("%d %d", &x, &y);
int ret = pfArr[input](x, y);
printf("%d\n", ret);
}
else if (input == 0)
{
printf("退出程序!\n");
}
else
{
printf("选择无效,请重新选择!\n");
}
} while (input);
return 0;
}
*8.1指向函数指针数组的指针
概念::一个指针指向一个数组,数组的元素都是函数指针