目录
指针的概念
在 C 语言中,指针就像是一个能指向其他变量的“箭头”。 打个比方,如果有一排房间(每个房间就是一个变量),指针就是房间的门牌号,通过门牌号我们就能找到对应的房间,进而对房间里的东西进行操作。
指针的初始化
--一定要初始化指针
Int arr【5】【6】 对于二位数组的取列,表示方法
Int(*p)【6】
效果是一样的,前者运算速度>后者写法P[4]=*(p+4)
Eg. P[4][2]=*(*(p+4)+2)
指针越界访问
--当寻找位置超过数组的大小时,就会变成野指针
--此时*p取得a的大小10(接受了a得返回地址了),如果*p再有*p=20(赋予其他地址),就会变为野指针
指针的三个类别
数组指针
1.概念
数组指针确实是一种指针,它指向的是数组的第一个元素
2.对于数组的指针引用的写法
Int arr[10]={0};
Int *p=arr(&arr[]);
*p=20;
指针数组
1.概念
指针数组是指一个数组,其元素是指针
2.写法
eg. int *a[10];
Char*arr[ ]={“ab,cd,ef”};
[ ]的优先级别>*,所以是先有3个数据,再说明它们都是指针类型
数组指针和指针数组的两者比较
1.共同点
后者是什么就是什么,比如指针数组==指向数组,数组指针==指向指针(指针==首元素)==指向首元素。
2.写法区别
指针数组:只有*没有挎号,数组指针:有
函数指针
表达方式+调用
Pf是例子,对应add,sum=2+3=5,调用可以加*(),也可以不加
- int (*pc)(int,int);
- int c; int a=10;int b=12;
- c=(*pc)(a,b); 3步骤就是指针函数的使用方法
如何避免野指针
- 如果不知道指针要初始化为什么,那就初始化为NULL(代表为0)
- 注意NULL后不能找0的地址(0的地址不能被访问)
- 要使用初始化为0的指针,那么用if(指针!=0)来判断使用
- Int a=10了之和已经被使用的地址了,再返回它就没有任何意义了(避免野指针地址的第4点)
意思是将arr内都改为1,
P++和p+i效果都是一样的+1跳过数组位置。
跳过在二维数组的应用
Eg:
1.i=0,j=1,i<5,j<6开始循环的二维数组:p+i可表示【i】
整体就可以变成*(【i】+j),
即【i】+【j】
*(*(p+i)+j)
相当于二维数组的累加/跳过某个位置
int sum_aaray(int b[][4])
{
int i,j,s=0;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
s=s+*(*(b+i)+j);
return s;
}
2.int(*p)【6】表示用p指针记录下总6行的信息
- 指针-指针=指针之间的绝对值的个数
- 相减的需要是同数组
计算元素个数
Star接收的是str的第一个a的地址,因为str开始位置是a,然后才让str进行后移的
二级指针
表达方式:**变量
指针优化
数组和指针下标都是从0开始
字符数组和字符指针处理字符串的区别
1.用法
字符数组+指针(指针数组) 字符指针
Char arr[10]; char*str;
Char*str=arr; str=”hello”;
Scanf(“%s”,str);
或者 单数组
Char str[10];
Scanf(“%s”,str);
2.修改地址方面
字符数组只能被引用,而不能被修改;字符指针可以反复修改
数组中数据的使用
Temp[m],不管是temp[j],temp[i]都可以使用到temp里面的数据,[?]方框里面是什么都只是用来指向数组的第几个数据