指针之示例大集合

参考

//这里也是传递的是一个指针,指针是通过传值的,但是我们将这个值赋值给一个指针的指针
//也就是把这个地址转换为一个保存在一个指针中的地址,那么这个指针就指向这个地址了
//这个副本是 char**类型的,也就是指针p保存的值为一个指针,所以传送过来的值就保存在
//这个char**类型的p的地址下,也就是重新将传过来的实参地址,转换为一个指针,
//然后保存在形参指针里面
void GetMemory1(char**p,int num) {
    printf("指针p的地址= [%p]\n",&p);
    printf("指针p指向的地址= [%p]\n",p);
    printf("指针(*p)的地址= [%p]\n",&(*p));
    printf("指针(*p)指向的地址= [%p]\n",(*p));
    *p = (char*)malloc(num);
    printf("指针p的地址= [%p]\n",&p);
    printf("指针p指向的地址= [%p]\n",p);
    printf("指针(*p)的地址= [%p]\n",&(*p));
    printf("指针(*p)指向的地址= [%p]\n",(*p));
}
//传过来的是一个指针,但是该指针是以传值得方式传过来的,也就是是源指针的一份cpy
//p是这个函数相对于实参的一个cpy,这个指针里面保存了一个值,是实参的地址
//然后给p赋值,p则指向的地址更改为其他的了
void GetMemory2(char*p,int num) {
    printf("指针p的地址= [%p]\n",&p);
    printf("指针p指向的地址= [%p]\n",p);
    p = (char*)malloc(num);
    printf("指针p的地址= [%p]\n",&p);
    printf("指针p指向的地址= [%p]\n",p);
}

void GetMemory3(char*p,int num) {
    printf("指针p的地址= [%p]\n",&p);
    printf("指针p指向的地址= [%p]\n",p);
}
char* GetMemory4() {
    char p[] = "Hello world";
    return p;
}
void main()
{
    printf("========通过传递指针的地址来分配内存=========\n");
    char* str = NULL;
    printf("指针str的地址= [%p]\n",&str);
    printf("指针str指向的地址= [%p]\n",str);
    //传指针的地址
    GetMemory1(&str,100);
    printf("指针str的地址= [%p]\n",&str);
    printf("指针str指向的地址= [%p]\n",str);
    strcpy(str,"Hello");
    printf("GetMemory1 >>>> str = [%s]\n",str);

    printf("=======通过传递指针来分配内存========\n");
    //这个一看就是有问题的,因为指针指向的为空,这样传过去的形参就是
    //指针所指向的地址,而这个地址是空
    char* str_0 = NULL;
    printf("指针str_0的地址= [%p]\n",&str_0);
    printf("指针str_0指向的地址= [%p]\n",str_0);
    //传的是指针指向的地址,但是指针还没有分配内存,所以
    //该值为空的地址,实际上传过去的是空的
    GetMemory2(str_0,100);
    printf("指针str_0的地址= [%p]\n",&str_0);
    printf("指针str_0指向的地址= [%p]\n",str_0);

    printf("=======通过强转指针地址来分配内存========\n");
    //这个一看就是有问题的,因为指针指向的为空
    char* str_1 = NULL;
    printf("指针str_1的地址= [%p]\n",&str_1);
    printf("指针str_1指向的地址= [%p]\n",str_1);
    //传的是指针指向的地址,但是指针还没有分配内存,所以
    //该值为空的地址,实际上传过去的是空的
    //或者
    //char* p_str = (char*)&str_1;
    //GetMemory3(p_str,100);
    //其实这还是指针的指针
    GetMemory3((char*)&str_1,100);
    printf("指针str_1的地址= [%p]\n",&str_1);
    printf("指针str_1指向的地址= [%p]\n",str_1);




    //传局部量
    char* strr_0 = NULL;
    strr_0 = GetMemory4();
    printf("GetMemory3 >>>> strr_0 = [%s]\n",strr_0);

    //野指针
    char* strr_1 = (char*)malloc(100);
    strcpy(strr_1,"hello");
    free(strr_1);
    if(strr_1 != NULL) {
        printf(" >>>> strr_1 = [%s]\n",strr_1);
        strcpy(strr_1,"world");
        printf(" >>>> strr_1 = [%s]\n",strr_1);
    }

    //预防野指针
    char* strr_2 = (char*)malloc(100);
    strcpy(strr_2,"hello");
    free(strr_2);
    strr_2 = NULL;
    if(strr_2 != NULL) {
        strcpy(strr_2,"world");
        printf(" >>>> strr_2 = [%s]\n",strr_2);
    } else {
        printf(" >>>> strr_2 == NULL\n");
    }
}
结果:
========通过传递指针的地址来分配内存=========
指针str的地址= [0018F7DC]
指针str指向的地址= [00000000]
指针p的地址= [0018F7D4]
指针p指向的地址= [0018F7DC]
指针(*p)的地址= [0018F7DC]
指针(*p)指向的地址= [00000000]
指针p的地址= [0018F7D4]
指针p指向的地址= [0018F7DC]
指针(*p)的地址= [0018F7DC]
指针(*p)指向的地址= [00C9B8F8]
指针str的地址= [0018F7DC]
指针str指向的地址= [00C9B8F8]
GetMemory1 >>>> str = [Hello]
=======通过传递指针来分配内存========
指针str_0的地址= [0018F7EC]
指针str_0指向的地址= [00000000]
指针p的地址= [0018F7D4]
指针p指向的地址= [00000000]
指针p的地址= [0018F7D4]
指针p指向的地址= [00C9B988]
指针str_0的地址= [0018F7EC]
指针str_0指向的地址= [00000000]
=======通过强转指针地址来分配内存========
指针str_1的地址= [0018F7E8]
指针str_1指向的地址= [00000000]
指针p的地址= [0018F7D4]
指针p指向的地址= [0018F7E8]
指针str_1的地址= [0018F7E8]
指针str_1指向的地址= [00000000]
GetMemory3 >>>> strr_0 = [1']
 >>>> strr_1 = [葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺]
 >>>> strr_1 = [world]
 >>>> strr_2 == NULL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值