| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1520 人关注过本帖
标题:双指针的问题
只看楼主 加入收藏
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:9 
双指针的问题
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}




请问为啥是&str,这是代表*p=&str吗?如果换成str行不行?
搜索更多相关主题的帖子: hello 
2016-07-19 14:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:7 
如果
void GetMemory( char* p, int num )
{
    p = malloc( num );
}
void Test( void )
{
    char* str = NULL;
    GetMemory( str, 100 );
    strcpy( str, "hello" );
    printf( str );
}
就相当于
char* str = NULL;

char* p = str;
int num = 100;
p = malloc( num );

strcpy( str, "hello" );
printf( str );
2016-07-19 14:28
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
收藏
得分:0 
回复 2楼 rjsp
那&str呢?源程序怎么解释?
2016-07-19 14:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
回复 3楼 georgefz
void GetMemory( char** p, int num )
{
    *p = malloc( num );
}
void Test( void )
{
    char* str;
    GetMemory( &str, 100 );
    strcpy( str, "hello" );
    printf( str );
}

相当于

char *str;

char** p = &str;
*p = malloc( num );

strcpy( str, "hello" );
printf( str );
2016-07-19 15:06
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
收藏
得分:0 
回复 4楼 rjsp
*p = malloc( num );这句话意思是给*P分配一段内存吗?那是怎么给str分配内存的呢?
2016-07-19 16:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
分配一段内存,将此内存的首地址赋值给*p
*p就是str呀
2016-07-19 22:47
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
收藏
得分:0 
回复 6楼 rjsp
*p不是指向str的地址吗?怎么又是str了
2016-07-21 10:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
以下是引用georgefz在2016-7-21 10:33:05的发言:

*p不是指向str的地址吗?怎么又是str了
你哪里看到*p指向str的地址了?

char** p = &str;
是p指向str的地址
2016-07-21 11:05
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:7 
以下是引用georgefz在2016-7-19 14:11:39的发言:

void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}




请问为啥是&str,这是代表*p=&str吗?如果换成str行不行?

存放地址的地方也有其地址。
这样写法是要将 p 作为I/O参数,初见不容易明白。
这样写可能较易理解:

char* GetMemory(int num)
{
    char *p = (char *) malloc( num );
    return p;
}
void Test( void )
{
 char *str = NULL;
 str = GetMemory( 100 );
 strcpy( str, "hello" );
 printf( str );
 free(str);
}
2016-07-21 15:44
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:7 
直接用 str 是不行的,原因在于 C 调用函数时是按值传递参数。假如把程序改成这样:

程序代码:
void get_memory(char *p, int n) {
    p = (char *)malloc(n);
}

int main(void) {
    char *str;
    get_memory(str, 10);
    strcpy(str, "hello");
    printf("%s\n", str);
    return 0;
}


调用 get_memory 时,仅仅只是给变量 p 分配了内存,而变量 str 依旧没有指向任何分配的空间,就因为 C 是传值调用的……

对于原先的程序,其内存分配示意图如下:

图片附件: 游客没有浏览图片的权限,请 登录注册


即是说,调用 GetMemory 后,str 的值也是没有改变的,变的只是它所指向的地址……

至于第一个程序能运行,只是个意外,可以把 str 跟 p 的地址打印出来看看

Read The Fucking Source Code~
2016-07-23 12:12
快速回复:双指针的问题
数据加载中...
 
   



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

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