如果有不会的智识点,请移动到博主前四篇指针博客!
可以当一个指针智商检阅博客看。
看看你是否掌握了这些知识
1:内存,指针变量
内存单元的编号==地址==指针;
指针变量和其他变量没有区别,指针变量是来存放指针的,类型有很多。
2:指针的类型(这是指针)
1:野指针(野狗)
1:野指针的成因
1:指针没初始化
2:指针越界访问
3:指针指向的空间释放
2:野指针的危害
直接让程序崩溃
3:如何避免野指针
1:你怕崩溃使用assert断言,提前检测
2:指针初始化,注意范围,释放完成及时加上NULL
2:字符指针变量(char*)
3:数组指针变量
1:指针指向的是数组的地址
2:格式和初始化
int arr[5] = {1,2,3,4,5};
//初始化,指针名是p
int (*p)[5] = &arr;
注意数组元素类型,注意数组元素个数
格式int (*)[5]
初始化就是&加上数组名
4:函数指针变量
1:指针变量指向函数地址
2:格式和初始化
int add(int x,int y)
{return x+y;
}
int main()
{
int (*p)(int x,int y)=&add;
//也可初始化成int (*P)(int,int);省略形参x和yreturn 0;
}
//int是函数返回类型
//p是函数指针变量名
//(int,int)是函数形参类型
注意函数返回类型和函数形参类型。
5:二级指针,三级指针等
就是指针变量存放指针变量的地址,只要我们要创建变量,就要在内存中开辟空间,开辟空间就会产生地址,产生地址就可以用指针变量来储存
int main()
{
int a=10086;
//一重指针
int*p1=&a;
//二重指针
int**p2=&p1;
//三重指针
int***p3=&p2;
return 0;
}
3:指针数组和函数指针数组(这是数组,后缀是数组就是数组)
1:指针数组
存放指针的数组,可以存放任何类型的指针,只要你的指针类型写的对。
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[5]={6,7,8,9,10};
//这是两个数组指针的初始化
int (*e1)[5]=&arr1;
int (*e2)[5]=&arr2;
//这是指针数组的初始化
int* p[5]={e1,e2};
return 0;
}
还是注意要存放指针的类型
2:函数指针数组
其实和指针数组也没什么区别,就是指针类型是函数指针罢了
int add(int x,int y)
{
return x+y;
}
int div(int x,int y)
{
return x/y;
}int main()
{
//函数名就是函数的地址,我就不取额外的函数指针变量了!!!!!!!
int (*p[2])(int,int)={add,div}
return 0;
}
4:数组名的理解(重点,重点,重点)
1:数组名就是是数组首元素的地址!!!!(除了两种情况)
1:sizeof(数组名)
sizeof中单独存放数组的时候,数组名表示整个数组,计算整个数组的大小,一定是单独!!!
2:&数组名
这里将数组存入数组指针变量时,数组名表示整个数组的地址(整个数组的地址和首元素的地址有区别)
2:二维数组名的理解
二维数组可以看成是多个一维数组集合而来,元素就是一维数组
由此二维数组的数组名,就表示第一行一维数组的地址。
#include<stdio.h>
void test1(int arr[][5], int x, int y)
//void test1(int(*p)[5], int x, int y)
{for (int i = 0;i < x;i++){for (int j = 0; j < y; j++){//printf("%d ", *(*(p + i) + j));printf("%d ",arr[i][j]);}printf("\n");}printf("\n");
}
void test2(int* p[5], int x, int y)
{for (int i = 0; i <x; i++){for (int j = 0; j < y; j++){//printf("%d ",*(*(p+i)+j));printf("%d ",p[i][j]);}printf("\n");}
}
int main()
{int arr1[5] = { 1,2,3,0,0 };int arr2[5] = { 4,5,6,0,0 };int arr3[5] = { 7,8,9,0,0 };int arr4[3][5] = { {1,2,3,0,0},{4,5,6,0,0},{7,8,9,0,0} };int* (p[3])[5] = { arr1,arr2,arr3 };test1(arr4, 3, 5);test2(p, 3, 5);return 0;
注意上述代码的三种传参方式和数组类型。
p是数组指针数组,是一个数组,模拟实现二维数组。