| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 770 人关注过本帖
标题:指针与函数参数的几个问题不太理解(基础)
只看楼主 加入收藏
xg911335
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-5-28
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
指针与函数参数的几个问题不太理解(基础)
-----------------------------------问题一:---------------------------------------------
程序代码:
void test(int *s, int num)//一级指针实现  和  void test(int **s, int num)二级指针 都能实现功能,请问这两种写法有什么区别?
{
    *s = malloc(sizeof(int)* num);
}
void main(void)
{
    int *p = NULL;
    test(&p,5);
    *p = 123456;
    printf("%d\n",*p);
    if (p){free(p);p = NULL;}
    getchar();
    return;
}
//main里调用test(&p,5),由被调函数分配堆内存。问题来了,原test函数是用二级指针(void test(int **s, int num))来实现的。后来我修改城一级指针(void test(int *s, int num))也能实现(vs2013测试通过)。请问这两种写法有什么区别?

-----------------------------------问题二:---------------------------------------------
程序代码:
void myMalloc(char *s)//用问题一的测试方式,函数参数改为一级指针却不行。二级指针却可以void myMalloc(char **s),为什么? (&p)取指针p的地址作实参传递给形参,那么形参s的值就是p的地址。通过*s指向p的内容为什么却不能改变p的值呢?
{
    *s = (char *)malloc(100);
}
void main(void)
{
    char *p = NULL;
    myMalloc(&p);//去p的地址传入
    if (p){free(p);p = NULL;}//p的值还是NULL,这里报错
    getchar();
    return;
}


-----------------------------------问题三:---------------------------------------------
程序代码:
void myMalloc(char *s)
{
    //*s = (char *)malloc(100);   
    *s = 32;  //为什么这样却能修改指针p 的值?那为什么“问题二”malloc出来的地址却不能修改呢?
}
void main(void)
{
    char *p = NULL;
    myMalloc(&p);
        printf("%d %d\n", p); //能打印p的值  32
    //if (p){free(p);p = NULL;}
    getchar();
    return;
}


[ 本帖最后由 xg911335 于 2015-7-8 01:23 编辑 ]
2015-07-08 01:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:5 
第一段代码报错
test(&p,5); 将int**类型传给int*,不兼容的类型
*s = malloc(sizeof(int)* num); 将void*类型传给int,不兼容的类型

第二段代码和第一段代码错得一样

第三段代码和第一段代码错得大部分一样,只是 *s = 32; 不算错而已
2015-07-08 08:25
rolimi
Rank: 4
等 级:业余侠客
威 望:1
帖 子:43
专家分:232
注 册:2015-6-10
收藏
得分:5 
主要在把一个指针赋值给另一个类型的问题。
第一个:
int * s;
*s = 指针;是把指针赋给一个int型,指针是unsigned或者unsigned long,这个赋值如果不等,free时也会报错
第二个,是把指针赋给一个char型,char只有一个字节,是放不下整个指针的,这个地址是错的,free时报错了
第三个,char能放下32,free时也会报错

呆呆的逗比程序猿
2015-07-08 10:05
实际应用
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:89
专家分:341
注 册:2015-5-30
收藏
得分:5 
猜想是这样的,不对请见谅
问题一能通过是因为int 和 指针都是4字节,*s 直接改动p 的内容
问题二通不过是因为char 是一字节, 将*s 给p 赋值时转换成char 信息损失,甚么值不知
2015-07-08 22:51
xg911335
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-5-28
收藏
得分:0 
感谢各位解答..

test(&p,5); 为什么取地址运算,p的类型会变成int ** ?

另外在请问一下,那里有比较好的C语言网络与线程的教程

[ 本帖最后由 xg911335 于 2015-7-9 15:35 编辑 ]
2015-07-09 15:34
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:5 
后来我修改城一级指针(void test(int *s, int num))也能实现(vs2013测试通过)


这些警告,不应该认为能实现和测试通过,本身就已经错了。比较不幸的是程序并没有崩溃。
以一个错误为基准再去延伸会越搅越浑

程序代码:
warning C4047: “=”:“int”与“void *”的间接级别不同
warning C4047: “函数”:“int *”与“int **”的间接级别不同
warning C4024: “test”: 形参和实参 1 的类型不同

人有多懒,编程就有多难。
2015-07-09 16:47
kehanping
Rank: 2
等 级:论坛游民
威 望:1
帖 子:25
专家分:88
注 册:2015-12-10
收藏
得分:0 
p本来就是地址了,&p当然就是二级地址(指针)
2015-12-19 23:50
快速回复:指针与函数参数的几个问题不太理解(基础)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046944 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved