鱼C论坛

 找回密码
 立即注册
查看: 1179|回复: 2

[已解决]求C语言二级指针问题

[复制链接]
发表于 2017-3-28 09:15:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
对于字符串类型的指针
*myp1=p1;*myp2=p2;和myp1=&p1;myp2=&p2;有什么区别

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int Testbin( char** myp1,int *mylen1, char **myp2, int *mylen2 ){
        char *p1=(char *)malloc(100);
        char *p2 =(char *)malloc(200);
        *myp1 = p1;
        *myp2 = p2;
        //myp1 = &p1;
        //myp2 = &p2;
        strcpy(p1, "hello my best friend");
        strcpy(p2, "hi how is it going");
        
        *mylen1 = strlen(p1);
        *mylen2 = strlen(p2);
        return 0;
}

int main(){
        char        *p1 = NULL;
        char        *p2 = NULL;
        int                len1;
        int                len2;
        Testbin(&p1, &len1, &p2, &len2);
        printf("len1:%d\n", len1);
        printf("len2:%d\n", len2);
        printf("p1:%s\n", p1);
        printf("p2:%s\n", p2);
        
        return 0;
}

运行结果
当是:*myp1 = p1;*myp2 = p2;时
len1:20
len2:18
p1:hello my best friend
p2:hi how is it going
请按任意键继续. . .
当是:myp1 = &p1;myp2 = &p2;时
len1:20
len2:18
p1:(null)
p2:(null)
请按任意键继续. . .
请问为什么,求大神解惑
最佳答案
2017-3-28 10:38:58
先回答下第1个问题:
myp1,myp2 两个是指向指针的指针,就是myp1,myp2中是一个内存地址,而这个内存中存储的内容是一个指针即是另一个内存的地址,当myp1=&p1;myp2=&p2;的时候,myp1和myp2存储的就是p1,p2的地址,而p1,p2中存储的是char类型的地址,初始化为NULL。
在函数中分配了两块内存p1,p2 ,*myp1 = p1;*myp2 = p2;即是将主函数中的p1,p2指针指向这两亏新分配的内存,因为*myp1 ==p1(主函数中的),实际就改变了主函数的p1,p2指针的内容,由于这块内存在函数使用后还在主函数中使用到,所以没有被释放掉,那么主函数的p1,p2实际有内容了,所以在主函数中输出就有值
而如果你使用myp1 = &p1;的话就是myp1指针指向的是函数内p1,存储的是函数内p1指针的地址,当你使用这个的时候,到了函数结束的时候就会释放掉,而主函数中的p1,p2还是指向NULL,所以p1,p2输出就是空的
而len1,len2在函数中修改了本身的值,所以在主函数输出都会有具体的值

指针就像门牌号一样,你调用函数的时候,如果使用的是函数内的指针,就像你填表的时候随便填一个门牌号一样,过后你家的门牌号还是不变,而当你的指针指向的是主函数时,相当于直接修改你家的门牌号,那么你家的门牌号就会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-28 10:38:58 | 显示全部楼层    本楼为最佳答案   
先回答下第1个问题:
myp1,myp2 两个是指向指针的指针,就是myp1,myp2中是一个内存地址,而这个内存中存储的内容是一个指针即是另一个内存的地址,当myp1=&p1;myp2=&p2;的时候,myp1和myp2存储的就是p1,p2的地址,而p1,p2中存储的是char类型的地址,初始化为NULL。
在函数中分配了两块内存p1,p2 ,*myp1 = p1;*myp2 = p2;即是将主函数中的p1,p2指针指向这两亏新分配的内存,因为*myp1 ==p1(主函数中的),实际就改变了主函数的p1,p2指针的内容,由于这块内存在函数使用后还在主函数中使用到,所以没有被释放掉,那么主函数的p1,p2实际有内容了,所以在主函数中输出就有值
而如果你使用myp1 = &p1;的话就是myp1指针指向的是函数内p1,存储的是函数内p1指针的地址,当你使用这个的时候,到了函数结束的时候就会释放掉,而主函数中的p1,p2还是指向NULL,所以p1,p2输出就是空的
而len1,len2在函数中修改了本身的值,所以在主函数输出都会有具体的值

指针就像门牌号一样,你调用函数的时候,如果使用的是函数内的指针,就像你填表的时候随便填一个门牌号一样,过后你家的门牌号还是不变,而当你的指针指向的是主函数时,相当于直接修改你家的门牌号,那么你家的门牌号就会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-28 13:43:33 | 显示全部楼层
lumber2388779 发表于 2017-3-28 10:38
先回答下第1个问题:
myp1,myp2 两个是指向指针的指针,就是myp1,myp2中是一个内存地址,而这个内存中存储 ...

非常感谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表