空指针是通用指针,可以保存任何数据类型的地址,但不与任何数据类型相关联。
void *ptr;
在C++中,我们不能将变量的地址分配给其他数据类型的变量。考虑以下示例:
int *ptr; //整数指针声明 float a=10.2;//浮动变量初始化 ptr= &a; //此语句引发错误。
在上面的示例中,我们声明了一个整数类型的指针,即ptr和一个float变量,即'a'。声明之后,我们尝试将'a'变量的地址存储在'ptr'中,但是在C++中这是不可能的,因为该变量不能容纳不同数据类型的地址。
通过一个简单的例子让我们理解。
#include <iostream.h> using namespace std; int main() { int *ptr; float f=10.3; ptr = &f;//error std::cout << "The value of *ptr is : " <<*ptr<< std::endl; return 0; }
在上面的程序中,我们声明了整数类型的指针和浮点类型的变量。整数指针变量不能指向float变量,但可以指向唯一的整数变量。
C++通过使用C++空指针克服了上述问题,因为空指针可以保存任何数据类型的地址。
让我们看一个简单的void指针示例。
#include <iostream> using namespace std; int main() { void *ptr; //空指针声明 int a=9; //整数变量初始化 ptr=&a; //将“a”变量的地址存储在 void 指针变量中。 std::cout << &a << std::endl; std::cout << ptr << std::endl; return 0; }
在上面的程序中,我们声明一个void指针变量和一个整数变量,其中void指针包含一个整数变量的地址。
在 C 中,我们可以将void指针分配给任何其他指针类型而无需进行任何类型转换,而在C++中,当我们将void指针类型分配给任何其他指针类型时,我们需要进行类型转换。
通过一个简单的例子让我们理解。
在C中,
#include <stdio.h> int main() { void *ptr;//空指针声明 int *ptr1; //整数指针声明 int a =90; //整数变量初始化 ptr=&a;//将'a'的地址存储在ptr中 ptr1=ptr;//将 void 指针分配给整数指针类型。 printf("The value of *ptr1 : %d",*ptr1); return 0; }
在上面的程序中,我们分别声明了两个类型为void和integer的指针" ptr"和" ptr1"。我们还声明了整数类型变量,即" a"。声明后,我们将变量" a"的地址分配给指针" ptr"。然后,我们将void指针分配给整数指针,即ptr1,而无需进行任何类型转换,因为在C中,我们在将void指针分配给任何其他类型的指针时不需要进行类型转换。
输出
在C++中,
#include <iostream> using namespace std; int main() { void *ptr;//空指针声明 int *ptr1;//整数指针声明 int data=10;//整数变量初始化 ptr=&data; //将数据变量的地址存储在 void 指针变量中 ptr1=(int *)ptr;//将 void 指针分配给整数指针 std::cout << "The value of *ptr1 is : " <<*ptr1<< std::endl; return 0; }
在上面的程序中,我们分别声明了两个类型为void和int类型的指针变量。我们还创建了另一个整数类型变量,即"数据"。声明后,我们将变量'data'的地址存储在一个空指针变量(即ptr)中。现在,我们想将void指针分配给整型指针,为此,我们需要将强制转换运算符(int *)应用于void指针变量。这个强制转换运算符告诉编译器void指针持有哪种类型的值。对于强制转换,我们必须在(char *)或(int *)之类的括号中键入数据类型和*。
输出
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)