上篇我讲到了指针变量和地址操作符,本篇我来继续深入讲解指针的知识点,本篇讲也是讲两个知识点
1.指针变量类型的意义
1.1指针的解引用
对比下面的两段代码不同之处,观察调试时内存的不同变化
通过调试我们可以看到,左侧的代码会把4给字节全部改为0,而右侧的却只会将一个字节更改为0。
结论:指针类型决定了,对指针解引用的时候能有多大的权限(即一次能操作几个字节)。
1.2指针 + - 整数
先看一段代码,并调试观察地址的变化。
代码的运行结果如下:
我们可以看出 int * 变量访问了4个字节,而 char * 变量只访问了一个字节。这就是指针变量类型差异所带来的变化。
结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。
1.3void*指针
我们都知道指针变量类型有整形int *,短整型short *,浮点型float * ,字符型char *4种类型,每一个都可以访问不同的字节,可是从一种类型到另一种类型的时候,却会出现如下图所示情况:
可见用另一种类型接收地址编译器是不兼容的,这时我们就要用到一个新的指针类型
那就是void * 指针
可见无论是什么类型,使用void * 指针都不会出现兼容性错误。因此需要存放地址的时候,都可以使用void * 指针。
但是void * 指针有一个问题,不能进行解引用和指针+ - 整数!!!
如上图所示可以使用void * 存放各种地址,解引用指针pa的时候会出现报错(非法的间接寻址),所以无法使用void *指针变量直接进行运算。
2.const修饰指针
2.1const修饰变量
我们都知道变量是可以修改的,把一个变量的地址交给一个指针变量的时候,通过指针变量也可以修改变量。如果我们希望给变量加上一个限制让它不能被修改的话,就需要用到const了。
上述代码中a是可以被修改的,而b是不可被修改的,可见const在修饰变量时可以让常量不能被修改,但b本质上还是一个变量。
结论:const修饰变量时会把变量变为常变量
上述图片结果可以看到这里有一个变量确实被修改了,但是这样子n被const修饰不就没有意义了吗?这样子是不合理的,所以应该让p拿到a的地址也不能修改a的值,那应该怎么做呢?这就要来到下一个知识点:const修饰指针变量。
2.2const修饰指针变量
我们先来看下面两段代码:
这些就是我本篇要讲的所有知识点了,希望这些对你们能够有所帮助