4、指针变量类型有什么作用?
变量有不同的类型,简而言之,我们指针有类型吗?有!
如果我们想要将一个 double 类型的数据放到一个变量中,我们会使用 double 类型,同理,如果我们要将一个 double 类型变量的地址放入一个指针变量中,是不是也应该用 double 类型的指针变量来存放呢?显然是的!
既然是这样,那么指针变量类型的意义在哪?我们举例来说明:
总结:指针的类型决定了指针向前或者向后走一步的举例有多大,这里我们在后面讲数组的时候也会一起讲,这里先做个铺垫。
5、指针的解引用
在学习操作符的时候,我们已经接触过解引用 * 操作符了,那么如何理解这个 * 号呢?我们可以也可以拿宿舍的例子来说,你要进宿舍,发现宿舍门被锁了,肯定要拿出要是来开锁,锁的锁芯是不是很像这个 * 号?进寝室必须要用钥匙,那么我们去读写一块内存是不是也要一把这样的钥匙呢?
我们接着来看一段代码:
int main() { int a = 10; int* p = &a; //把a的地址取出来放到指针变量p中,以后可以通过p间接访问a int b = *p; //这里*p等价于a,把a变量的内容赋值给b *p = 20; //解引用找到a,把a变量的内容更改为20 return 0; }
本段代码对 *p 完整的理解是,取出p中存放的地址,访问该地址指向的内存单元(空间或者内容),起始通过指针变量访问,本质是一种间接寻址方式!
总结:对指针变量解引用,就是指针变量所指向的目标。所以如上代码 *p 就是 a
对解引用概念有了解之后,我们再来看一个例子:
这里我们通过查看内存,发现了第一次 *pc 只修改了一个字节的内容,第二次的 *pi 修改了四个字节的内容,正好对应着他们分别是 char* 类型和 int* 类型
总结:指针的类型决定了,指针解引用的访问权限有多大!
6、如何将数值存储到指定的内存地址?
有了上面的对指针的研究,知道了指针的本质就是地址,地址也是数据,那么我们之前说指针解引用是间接访问,那么我们可以直接通过地址数据对变量进行直接访问吗?
int main() { int a = 10;//假设a变量的地址是0x12345678,那么访问a变量,还可以直接通过指针变量方式进行访问 printf("%d\n", *(int*)0x12345678); //本质是一种直接寻址的方式 *(int*)0x12345678 = 100; //本质是一种直接寻址的方式 return 0; }
其实目前这种已经不可取了,现在主流的编译器和操作系统,为了安全已经有很多的内存保护机制,像 windows,linux 都有栈随机化的机制等,就好比你每次运行这个变量 a 的地址都是不一样的,在我们测试中,在windos平台和linux平台,使用C语言定义的局部变量在每次运行的时候都是不同的。