美文网首页
void指针与NULL指针

void指针与NULL指针

作者: lxr_ | 来源:发表于2021-10-09 13:10 被阅读0次
#include <stdio.h>

int main(int argc, char** argv)
{
    //void a;  不能使用void定义,编译器不知道分配多大内存

    int num = 1024;
    
    int* pi = &num;
    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;
}

相关文章

网友评论

      本文标题:void指针与NULL指针

      本文链接:https://www.haomeiwen.com/subject/qyjqoltx.html