在本文中,我们将学习C语言中的“空指针”。在进一步深入之前,最好通过阅读-来刷新指针C中指针的介绍。指针变量通常用“内容”的数据类型声明,该数据类型将存储在内存位置(指针变量所指向的位置)中。
例:- char * ptr;int * ptr;* ptr浮动;
使用特定数据类型声明的指针变量不能保存其他数据类型变量的位置地址。它是无效的,并将导致编译错误。
例:- char * ptr;
int var1;
ptr = var1;//这是无效的,因为' ptr '是字符指针变量。
这就是a的重要性“void指针”.void指针只不过是一个指针变量,它是用C语言' void '中的保留字声明的。
例:void * ptr;//现在ptr是一个通用指针变量
当一个指针变量使用关键字void声明时——它就变成了一个通用指针变量。任何数据类型(char, int, float等)的任何变量的地址都可以被赋给void指针变量。
解除对空指针的引用
我们在《c语言指针导论》一文中已经了解了如何解除指针变量的引用,我们使用间接操作符*来实现这一目的。但在void指针的情况下,我们需要对指针变量进行类型转换,以解除对它的引用。这是因为空指针没有与之关联的数据类型。编译器无法知道(或猜测?)void指针指向的是什么类型的数据。因此,为了获取由void指针指向的数据,我们使用void指针位置中保存的数据的正确类型对其进行类型转换。
示例程序:
# include
void main ()
{
int = 10;
浮动b = 35.75;
void * ptr;//声明一个空指针
ptr =和;//为空指针赋值。
printf("The value of integer variable is= %d",*(int*)ptr);// (int*)ptr -用于类型转换。其中as *((int*)ptr)解引用类型转换的void指针变量。
ptr =魅;//将float赋给void指针。
printf(" float变量的值是= %f",*((float*) ptr));
}
输出:
整型变量的值为= 10
float变量的值是= 37.75
如果程序员不确定最终用户输入的数据类型,则void指针非常有用。在这种情况下,程序员可以使用一个void指针来指向未知数据类型的位置。程序可以设置为要求用户告知数据的类型,并根据用户输入的信息进行类型转换。下面给出了代码片段。
Void *a, int z
{
如果(z = = 1)
printf (" % d”* (int *));//如果用户输入1,则表示该数据是一个整数,并相应地进行类型转换。
else if (z = = 2)
printf (" % c”* (char *));//字符指针类型转换。
else if (z = = 3)
printf (" % f”*(*)浮动);//对浮点指针进行类型转换
}
关于空指针你应该记住的另一个重要的一点是-指针运算不能在空指针中执行。
例子:-
void * ptr;
int;
ptr =和;
ptr + +;//该语句无效,将导致一个错误,因为'ptr'是一个空指针变量。
8评论
谢谢!非常有帮助。我有一个问题:什么时候使用类型为void*的变量指向函数是有用的?我们将不得不面对什么后果?
非常感谢你,伙计!
好解释。
但在第一个例子中有一个修正
"它是无效的,并将导致编译错误。"
它不会导致编译错误,而是会编译并生成一个编译时警告:
警告:赋值来自不兼容的指针类型
指针算术:这个例子在gcc 4.7.2中编译:
# include
// gcc -Wall -o 08_puntero_void_aritmetica 08_puntero_void_aritmetica 08_puntero_void_aritmetica
int主要(空白)
{
Int a = 10;
void * p;// declare ando un puntero void
p =和;
printf(" Direccion de a = %p\n ", &a);
Printf (" p = %p\n ", p);
p + +;
Printf (" p = %p\n ", p);
返回0;
}
很好地解释了空指针。
太酷了!
由于Maruf
TQ老兄