辣的果丶 发表于 2016-8-30 23:05:11

传址怎么传不过去?

void fun ( char *s )
{ char a;
strcpy( a, "STRING" );
s = a;
}
main()
{ char *p="PROGRAM";
fun( p );
printf("%s\n",p);
}

指针p本来指向 “”PROGRAM“”的开头,经过fun()函数把p指针又指向了a的开头,我解释的对吗?为什么?

Krant5 发表于 2016-8-30 23:07:31

你不能这样的,你在函数中创建了局部变量 数组 a,然后将局部变量的地址赋值给另一个局部变量,,,你这样没用的

辣的果丶 发表于 2016-8-30 23:09:18

Krant5 发表于 2016-8-30 23:07
你不能这样的,你在函数中创建了局部变量 数组 a,然后将局部变量的地址赋值给另一个局部变量,,,你这样没 ...

那怎么改才行?

Krant5 发表于 2016-8-30 23:15:40

辣的果丶 发表于 2016-8-30 23:09
那怎么改才行?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void fun ( char **s )
{
char *a=(char *)malloc(10*sizeof(char)) ;
strcpy( a, "STRING");
*s = a;
}
main()
{ char *p="PROGRAM";
fun( &p );
printf("%s\n",p);
free(p);
}

辣的果丶 发表于 2016-8-30 23:26:56

Krant5 发表于 2016-8-30 23:15


我能看懂。。但是还不明白啥意思?不知道为什么这样写

Krant5 发表于 2016-8-30 23:32:05

辣的果丶 发表于 2016-8-30 23:26
我能看懂。。但是还不明白啥意思?不知道为什么这样写

你想再另一个函数中改变一个产量的值,那就必须传他的地址,而这里他是指针变量,所以说他的地址的类型是char* *.而函数中创建的局部产量会在返回时释放,所以说可以用malloc进行手动分配和释放

辣的果丶 发表于 2016-8-31 09:28:37

Krant5 发表于 2016-8-30 23:32
你想再另一个函数中改变一个产量的值,那就必须传他的地址,而这里他是指针变量,所以说他的地址的类型是 ...

意思是不是说 malloc函数分配创建的不是局部变量了?

辣的果丶 发表于 2016-8-31 09:37:54

Krant5 发表于 2016-8-30 23:32
你想再另一个函数中改变一个产量的值,那就必须传他的地址,而这里他是指针变量,所以说他的地址的类型是 ...

fun(p) 不是已经传递地址了吗 为什么还要用 fun(&p)地址的地址?

heblhc 发表于 2016-8-31 09:38:11

p指向的是一个字符串常量,存在全局区,是不能被修改的,可以使用字符数组。

辣的果丶 发表于 2016-8-31 10:49:45

heblhc 发表于 2016-8-31 09:38
p指向的是一个字符串常量,存在全局区,是不能被修改的,可以使用字符数组。

不对吧,p指向的没声明在全局区呀,不应该在常量区吗

heblhc 发表于 2016-8-31 14:01:38

辣的果丶 发表于 2016-8-31 10:49
不对吧,p指向的没声明在全局区呀,不应该在常量区吗

其实我想说的就是这是个字符串常量,打错了

倾天 发表于 2016-8-31 18:29:28

你要知道,s = a 中的 s 只是 fun 中的一个变量,更改fun 中的 s 并不会改变外面p的值

Krant5 发表于 2016-8-31 22:09:39

辣的果丶 发表于 2016-8-31 09:37
fun(p) 不是已经传递地址了吗 为什么还要用 fun(&p)地址的地址?

你想啥呢,P 就是一个指针变量,你传递的只是P得值 ,字符串的首地址,你要改变P 的指向,肯定要取地址&p

紫瞰 发表于 2016-9-3 09:59:54

好厉害

紫瞰 发表于 2016-9-3 10:00:35

指针这个部分我一直都学得不是太明白,这下学习好多
页: [1]
查看完整版本: 传址怎么传不过去?