目录
1.指针变量类型的意义
指针变量的大小和类型无关,只要是指针变量,在同⼀个平台下,大小都是⼀样的,为什么还要有各种各样的指针类型呢?
1.1指针的解引用
通过调试,对比下面的代码,主要观察内存的变化
通过调试,我们可以看到,第一个代码会将 a 的四个字节全部改为 0 ,第二个代码会将 a 的第一个字节改为 0
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。
- char * 的指针解引用就能访问 ⼀个字节
- int * 的指针的解引用能访问 四个字节
- float * 的指针的解引用能访问 四个字节
- double * 的指针的解引用能访问 八个字节
- float * 的指针的解引用能访问 二个字节
1.2指针 + - 整数
通过下面的代码,调试观察它们的地址变化
我们可以看出,char * 类型的指针变量 +1 跳过1个字节, int * 类型的指针变量 +1 跳过了4个字节。 这就是指针变量的类型差异带来的变化。
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
1.3 void 指针
在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。但是也有局限性, void * 类型的指针不能直接进行指针的 + - 整数和解引⽤的运算。
在代码中,将⼀个 int 类型的变量的地址赋值给⼀个 char * 类型的指针变量。 编译器给出了⼀个警告(如左图),是因为类型不兼容。 而使用 void * 类型就不会有这样的问题。
使用 void * 类型的指针接收地址并修改
通过左边的图,我们可以清晰的看到 void * 类型的指针可以接收不同类型的地址,但是无法进行修改 那么 void * 类型的指针有什么用呢? ⼀般 void * 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。
2. const 修饰指针
总结:
- const 如果放在 * 的左边,限制的是 * p ,意思是不能通过指针变量 * p 去修改 p 指向的空间的内容, * p // err 但是p变量不受限制,还是可以修改的,p=&b // ok
- const 如果放在 * 的右边,限制的是 p 变量,意思是 p 变量不能被修改,无法指向其他变量 p = & b // err 但是 指针变量*p不受限制 还是可以修改的,* p // ok
- const 如果放在 * 的两边,则都不能修改
3.指针运算
- 指针 + 整数 = 指针
总结:指针每加一个整数的内存空间就打印下一个整数,以此类推,直到循环结束。
- p=0x005AF9C0
- p+1=0x005AF9C4
- p+2=0x005AF9C8
- ……
一个整型变量的内存空间等于四个字节,相当于指针与下一个指针的地址空间互相相差四个字节
- 指针 - 指针 = 整数
总结:
指针-指针等于整数,用于计算两个指针在内存中的相对位置,并通过类型转换将其表示为整数