今天学指针,做事容易走神,终于看完了一集
认真对待每一天,时间才会多起来,下次还是去自习室学习比较好,氛围决定心态和效率
指针的定义
今天学习指针。
指针,初始化后,它会在寄存器上开辟一个新的地址,存放着指向的地址,并有访问权限,除了0。和变量类似,变量是开辟新地址,里面放着变量。
定义的格式:
int a=0; int *str=&a;
操作指针的方法
str就是我们定义的指针,本身是个地址(和数组名字等于首元素的地址,有点类似,和字符串首元素就是字符串起始地址类似),指向了a的地址,存放了a的地址。
&,&a相当于取了a的地址
str此时是指针,其地址不等于a的地址,里面存放着a的地址
解引用 * (星)
当然str只能表示地址,那知道了地址,就得看看地址里面放了东西,或者说对这个地址有了操作的权限,叫做解引用,解引用是一个操作字符,所以需要一个字符 * 代表着解引用这个操作。
指针变量定义
*str是一个指针变量,也是一个对地址进行解引用的操作,简单地说就是看看地址里面的东西,也就是看到了a里面的东西。所以*str能通过地址看到里面存放的值
指针的意义
鹏哥的视频里面说到,指针的两个意义
1、定义指针的数据类型,决定了这个指针的访问权限
2、定义指针的数据类型,决定了这个指针的跨度
数据类型决定了指针的访问权限,这里指针的char型只能改变一个字节
数据类型决定了指针的跨度,这些加一,访问的地址不同
野指针问题
三种(基本都是无权限访问的原因)
1、指针未初始化(不知道指向谁,指向随机值,未定义,则不管指向谁,都是无权限的)
2、指针访问越界(定义的范围内,没有这个地址,访问到就是权限越界)
3、指针指向的变量已被释放(指针指向的变量函数返回值的局部变量,这个变量是栈区的,也就是,暂时存储的,释放掉空间时,造成访问越界)
空指针
int *str=NULL
空指针指向 (void*)0,指向 地址0,但是指向地址0,不代表有其访问权限(系统不允许的地址访问)
指针的运算
这里很经典,首先和大家说下指针和整数的加减关系,这里的关系与之前提到的指针意义,数据跨度相关。
指针 +\- 整数
访问到地址的跨度,由数据类型来决定,比如
int a = 1;
int *str = &a;
char *abc = &a;
printf("%d",str+1);
printf("%d",abc+1);
abc跨度只有1字节,str跨度有4字节,和数据类型相关,当然这里就算加一,也不代表有权限,因为初始化的时候,并未说明,我们只能看到加以后的地址。
指针 +\- 指针(在数组里)
指针和指针进行加减操作,只能在同一空间里的。数组就是一些元素的集合,C语言的里指针指向数组,代表着获得访问权限是数组里所有的地址的权限,当然只要加减不要离开数组地址意外的访问,基本都可以随便加减,这里加减,很多人会想到为啥不是288881484与288881448相减等于36呢?指针加一都是显示地址的,为啥这里是序号相加减呢?
在指针的加减里,就是地址之间的加减以跨度为单位计算(个人理解)
学完整个课程,再来回顾
指针运算关系
允许 与 存放的地址之后的地址作比较,不能 与 存放的地址之前的地址作比较
二级指针
int a=10;
int *p=&a;
int **pppp=p;
大概就是这个意思*pppp=&p,**pppp=10
[ ] 操作字符
今天还学到了 [ ]这个操作字符,arr[10]
arr[0]=*p,arr[1]=*p+1,*p+1=*1+p,*p+1=*(1+p),1[arr]=*1+p,关系都相等,在低层里[ ]会自动转换来识别
int arr[10] = { 0,2,3,0,0,6,7,8,9,0 };
int* p = arr;
指针数组
今天还认识了指针数组这个概念,就是开辟一系列的存储地址,里面存放的一系列的指针int*arr[10];