指针指针,就像他的字面意思一样,像指南针的指针指向某个刻度,那个刻度代表某个位置。在生活中我们要去一个地方首先要知道目的地的地址,这个地址就是我们所说的指针。在计算机中数据都是存储在内存中的,我们用内存地址唯一标识内存的位置,我们通过得到内存地址来获取数据。在c语言指针就是内存地址,指针变量是用来存放内存地址的,变量就是一块能存放数据的盒子,我们可以根据存放数据的类型分类变量的类型。指针变量就是可以存放内存地址的数据类型,通过内存地址我们可以获取目标数据。
指针变量的定义很简单,假如要获得一个int类型的数据的地址,int * a=&a;如果要获得其他类型的地址便把int换成相应的类型即可。那么如何用代码实现地址找到数据呢,上面我们创建了a的指针变量那么我们可以通过解引用操作符*来实现*a就可以对目标数据进行操作了。指针也可以当作函数参数,但是问题来了如果我们要实现一个两个数的加法如果是两个int数相加就写int类型指针参数如果是double类型相加那么就是double类型的指针参数,那么代码的复用性就比较低了,所有有了void类型的指针类型,void类型的指针可以接受任何类型数据的地址,但是void类型的指针不能直接解引用想要访问数据必须强制类型转换之后才能解引用。
指针的运算指针可以进行加减运算,指针的加减运算就是移动指针的指向位置,如果是运算int类型的指针那么就是指针地址加减4个地址。
const修饰指针,const修饰普通变量时该变量就变成一个常量了,const修饰指针也同理,const修饰指针变量分两种情况一个是const放在*左边此时修饰*p该指针无法通过解引用访问目标数据,二是放在*右边此时修饰p该指针无法改变存储的地址。如果const在*的两边,那么上面说的两种作用都将满足。
新手在使用指针时要小心野指针的出现,所谓野指针就是指针非法了,野指针有三种情况,一是指针未初始化,指针没用存放地址却访问目标数据就相当于忘了自己家的位置非法闯入别人的家,二是指针越界,加入一个楼层只有401-410号房间你却要访问411,这就是属于越界访问了,第三种是指针所指向的数据被释放了,相当于一个房间后来被拆了,却又要访问这个房间。所以新手在使用指针时一定要做好对指针的初始化,用完指针时要把指针置空。
学过数组的同学都知道数组名大部分情况下就是数组的首元素地址,那么可以将数组名当成指针来理解只有在sizeof和&时有所不同。
指针变量是一种数据类型,数组是放置相同数据类型的集合,那么数组能否存放指针变量呢,答案当然是可以的。加入创建一个存放int*指针的数组语法是int * arr[]跟int arr[]就差个*。
指针可以存放基本数据类型那么指针能否存入数组丶函数等类型呢,层层递进这才是学习编程的魅力,指针的学习就像一层套一层。数组指针的语法void (*p)[] ,*p代表这是个指针因为[]的优先级比*高所以要加括号。函数指针 void (*p)(void a)。
有了函数指针这个数据类型便有存放函数类型的数组语法是void (*p[])(void a),可以存放函数指针。
学习利用指针,是掌握c语言的必需品,如果对指针感兴趣可以看《c和指针》这本书。