关于难难难的指针(基础版)

  指针指针难难难!!!那么我们在对指针进行一个比较深入的理解之前,我们应该对指针所学的知识模块做一个基础的了解。

内存和地址指针变量和地址指针的运算野指针assert断言
指针访问数组一维数组传参二级指针指针数组冒泡排序
字符指针变量数组指针变量函数指针变量函数指针数组转移表

以上是目前我学习到的。要了解指针,我们可以先类比理解一个概念:内存单元的编号==地址==指针,这个可以帮助我们了解什么是指针。如何得到地址?这里我们引入了新的符号:&(取地址符)。通过取地址符(&)拿到的地址是⼀个数值,这个数值有时候也是需要存储起来,⽅便后期再使⽤。这个地址就要存放在指针变量中,它是用来存放地址的。例如:

int a=999;
int *p=&a;

在这里面,int是p的指向类型,*旨在说明p是一个指针变量。注意指针变量的类型和大小是无关的。在指针类型中,有一种特殊的void*型,这种类型的指针可以⽤来接受任意类型地址。但是也有局限性:void* 类型的指针不能直接进⾏指针的加减整数和解引⽤的运算。

  const修饰变量,我理解来说就是让变量一直处于设置的初值不变。但是在指针变量当中,const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。 const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

  野指针就是指针指向的位置是随机的,不可预知的。那么我们如何避免野指针的出现?这时候,如果我们直接知道指针指向哪里就直接赋值,如果我们不知道,就可以直接给指针赋值NULL。例如:

int *p=NULL 
//或者
#define NULL ((void *)0)

  assert.h 头文件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终止运⾏。这个宏常常被称为“断⾔”。但assert的缺点是增加了程序运行的时间。一般我们可以在Debug中使用,在Release版本中选择禁用assert就行。

 我们常常把指针和数组联系到一起。我们要知道,数组名就是数组首地址(第一个元素)的地址。如果我们定义一个数组:int arr[10],在编辑的时候我们会发现:arr==&arr[0]==&arr;但是如果我们在他们的基础上分别+1,就会发现arr和arr+1前后相差了40个字节,因为arr+1是相当于跳过了整个数组。而&arr和&arr+1只相差了四个字节。

  结合着以上的特点,我们可以用指针访问数组了!!!综合以上的知识点,我们可以对指针有一个初步的理解。我们要了解指针和数组之间建立的关系并合理运用,也要知道野指针的危险性,还有assert的优缺点。基于此,才能对后续指针的学习有更好的理解。

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值