这节我们接着往下讲解指针。
void*:
先介绍几种常见的指针类型:
char* 指向字符的指针
short* 指向短整形的指针
int* 指向整型的指针
float* 指向单精度浮点型的指针
......
还有一种指针是:void*:
这是无具体类型的指针(泛型指针)可以接受任何类型地址,但也有局限性,它不可以直接进行指针的加减和解引用运算
这里我们首先先说明一下无具体类型指针是什么
下面是我们给出的代码:(vs2022)
就比如这个,我们的编译器很明确的指出了地址和指针类型不兼容 ,这样会造成数据截断,有可能会丢失重要信息 ,而下面这个使用void*就不会出现地址和指针类型不兼容的情况了。
那么下面这段代码就向我们证明了void*是无具体类型的指针(泛型指针),void*可以接受任何类型地址
在我们不清楚存储的数据类型时最好使用void*指针
接着我们来解释为什么 它不可以直接进行指针的加减和解引用运算
给出代码:
这两幅图可以看出void*不可以直接进行指针的加减和解引用运算,void*这种无具体类型的指针无法确定引用时访问几个字节,所以void*无法解引用,进行加减时同样也无法判断访问几个字节,所以也不能进行加减运算。
void*指针无法进行加减和解引用,那么void*有什么用呢?
//一般void*类型的指针是使用在函数参数部分,用来收取不同类型数据的地址,这样的设计可以实现泛型编程的效果。可以让一个函数来处理多种类型的数据
这里我们先简单了解void*指针就可以,后面会详细介绍它的。
const:
变量是可以修改的,如果我们把变量的地址放在一个指针变量里,我们也可以通过指针变量修改这个变量。
但是当我们希望限制一个变量,让它不能被修改时,我们需要使用const
我们对比一下下面的两幅图可以清楚的发现被const限制的变量是无法进行修改的,第二幅图中的a就具有了常属性,但是a并不是常量,我们在第三幅图中验证一下。(C++中const修饰的变量是常量)
当一个变量被const修饰,但你必须要改变它的值时,那我们可以用下面代码展示的方法:
const修饰指针变量:
const可以放在*的左边,也可以放在*的右边,但是这两种的意义不同。具体看下面代码:
通过上面的两幅图不难看出const修饰指针变量的时候放在*的右边的意义是:限制的是指针变量的本身,指针变量不能再指向其他变量了,但是可以通过指针变量修改指针变量指向的内容。
而我们可通过下面这两幅图看出当const放在*的左边时,限制的是指针指向的内容,不能通过指针修改指针指向的内容,但是可以修改指针变量本身的值(修改的是指针变量的指向)
然而当我们在*的左边和右边都放上const时,指针指向的内容和指针变量本身 就都被限制了,此时它们都无法被修改,如下代码演示: