#include <stdio.h>
int main(int argc, char** argv)
{
//void a; 不能使用void定义,编译器不知道分配多大内存
int num = 1024;
int* pi = #
char* ps = "helloworld";
void* pv; //void*可以指向任意类型指针,即任意类型指针可以转换为void*
pv = pi; //指向整型指针
printf("pi:%p,pv:%p\n", pi, pv); //pi:00AFFCCC,pv:00AFFCCC
//printf("*pv:%d\n", *pv); //void* 指针不能解引用 不知道内存大小
printf("*pv:%d\n", *(int*)pv);//将其进行强制类型转换即可进行解引用
pv = ps; //指向字符型指针
printf("ps:%p,pv:%p\n", ps, pv); //ps:00297B30,pv:00297B30
//printf("*pv:%d\n", *pv); //void*指向字符串的首地址时,有些编译器可以实现解引用,因为字符串有结束符
printf("*pv:%s\n", (char*)pv);//将其进行强制类型转换,字符串使用首地址即可访问,故不需要*
//void类型也可以转换为其他类型,最好使用强制转换
void* ppv = NULL; //NULL指针表示ppv不指向任何东西,
//当不知道指针指向哪里的时候,可使其指向NULL,在对指针进行解引用时,判断该指针是否为NULL指针
int* ppi = (int*)ppv; //不使用强制转换也可以,但可读性差,最好加上(int*)
//总结:void*指针支持不同类型之间合法转换
//int* p1; //如果不初始化,称为野指针,有些编译器会报错,有些可以执行解引用后为随机值
int* p2 = NULL;
//printf("%d\n", *p1); //可能报错,可能为随机值
printf("%d\n", *p2); //解引用NULL指针为非法操作,程序崩溃
return 0;
}
网友评论