指针指针难难难!!!那么我们在对指针进行一个比较深入的理解之前,我们应该对指针所学的知识模块做一个基础的了解。
内存和地址 | 指针变量和地址 | 指针的运算 | 野指针 | 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的优缺点。基于此,才能对后续指针的学习有更好的理解。
标签:arr,变量,难难,assert,地址,关于,数组,指针 From: https://blog.csdn.net/2303_81468851/article/details/136687763