原以为自己对指针掌握了,却还是对这个问题不太明白。请教!

wayne92 2005-03-22 11:35:29
程序1:
void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);
}

void main()
{
char *p=NULL;
myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?
if(p) free(p);
}
程序2:void myMalloc(char **s)
{
*s=(char *) malloc(100);
}

void main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
程序3:
#include<stdio.h>

void fun(int *p)
{
int b=100;
p=&b;
}

main()
{
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
结果为
10
10
程序4:
#include<stdio.h>

void fun(int *p)
{
*p=100;
}

main()
{
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
结果为
10
100
为什么?



...全文
973 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
xifeng_520 2005-03-30
  • 打赏
  • 举报
回复
dffgh
wayne92 2005-03-28
  • 打赏
  • 举报
回复
不好意思
贴错地方了
呵呵
wayne92 2005-03-28
  • 打赏
  • 举报
回复
谢谢,我已经改好了
/*统计c中代码行和注释行的数量*/
#include<stdio.h>

struct fun{
int zhushi;
int hangshu;
int flagzhushi;
int *flagzhw;
}a;
struct fun *p=&a;




void recomment(int c,struct fun *p);
void in_comment(struct fun *p);
void echo_quote(int c);

main()
{


int c;


while( (c=getchar())!=EOF )
recomment(c,p);

printf("%d,%d\n",p->zhushi,p->hangshu);

return 0;
} /*主函数完成*/






void recomment(int c,struct fun *p)
{

int d;
if (c == '/'){
if ( (d=getchar()) =='*' )
in_comment(p);/* 进入注释处理函数*/
else if ( d == '/' )
recomment(d,p); /*递归*/
}

else if ( c == '\'' || c == '"' )
echo_quote(c); /* 在引号内的注释不算*/
else if ( c == '\n'){ /* 对回车的处理(考虑了各种情况)*/
if(p->flagzhushi == 1 ) /*此行有注释*/
++ (p->zhushi);
if ( p->flagzhw==1 )
++ (p->hangshu);
p->flagzhw=p->flagzhushi=0;
}else if ( p->flagzhw == 0 && c !=' ' )
p->flagzhw=1;
} /*完成*/


void in_comment(struct fun *p)
{

int c,d;

c=getchar();
d=getchar();
while ( c != '*' || d != '/' ){
if ( c == '\n' ){
++ (p->zhushi);
if ( p->flagzhw == 1 )
++ (p->hangshu);
}
c=d;
d=getchar();
}
p->flagzhushi=1;
} /* 完成*/



void echo_quote(int c)
{
int d;
while ( (d=getchar()) !=c )
if ( d=='\\')
getchar(); /*忽略转义字符*/
} /*完成*/

多谢各位!!!!
qq345270199 2005-03-23
  • 打赏
  • 举报
回复
谢谢,学了不少!~~~
tigeroar 2005-03-23
  • 打赏
  • 举报
回复
就是形参和实参的关系吧。
皮皮鲁 2005-03-23
  • 打赏
  • 举报
回复
mark
sky911911 2005-03-23
  • 打赏
  • 举报
回复
学习中!!
lito_rat 2005-03-23
  • 打赏
  • 举报
回复
学了不少
yanfeng106 2005-03-23
  • 打赏
  • 举报
回复
s相当于myMalloc的局部变量,函数返回就无效了。
建议该函数为:
char *myMalloc() //我想在函数中分配内存,再返回
{
return (char *) malloc(100);
}

然后如下调用
p = myMalloc();


NewWriter 2005-03-23
  • 打赏
  • 举报
回复
是该多看看书了
ybt631 2005-03-23
  • 打赏
  • 举报
回复
值传递的 问题
ypengfei 2005-03-23
  • 打赏
  • 举报
回复
程序1:
void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);
}


返回值类型应该是指针。你这个是没有返回值类型。
nbamjzhldm 2005-03-23
  • 打赏
  • 举报
回复
c和指针那本书不错
wayne92 2005-03-23
  • 打赏
  • 举报
回复
学习学习再学习!!
谢谢楼上的各位
我明白了
Featured 2005-03-22
  • 打赏
  • 举报
回复
楼主看一下const int *p;的介绍就一切都明白了

你要要改变指针指向的地址,比如从 0x20ffea02 指向 0x20ffea03;(32位内存寻址空间)
还是要改变指针指向地址的内容,比如原来是 34 ,改成 35
这二者不同的
gnixemos 2005-03-22
  • 打赏
  • 举报
回复
程序1 这样写 char * p ; p 的值不能被修改,所以传入为NULL,传出也是NULL
dongpy 2005-03-22
  • 打赏
  • 举报
回复
你要弄清楚的是指针变量和指针所指的变量(可能是一片内存)。

指针变量和普通变量一样存储的,

如int *p; int i; p和i都是变量,都占用一个字的内存,都可以取这个空间的地址:&p,&i

指针变量的特殊之处在于:它可以存放其他变量的地址。
junmayang 2005-03-22
  • 打赏
  • 举报
回复
void main()
{
char *p=NULL;
myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?
if(p) free(p);
}


void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);
}

myMalloc(p)的执行过程:
分配一个临时变量char *s,s的值等于p,也就是NULL,但是s占用的是与p不同的内存空间。此后函数的执行与p一点关系都没有了!只是用p的值来初始化s。
然后s=(char *) malloc(100),把s的值赋成malloc的地址,对p的值没有任何影响。p的值还是NULL。
注意指针变量只是一个特殊的变量,实际上它存的是整数值,但是它是内存中的某个地址。通过它可以访问这个地址。

程序2:void myMalloc(char **s)
{
*s=(char *) malloc(100);
}

void main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
程序2是正确的,为什么呢?看一个执行过程就知道了:
myMalloc(&p);将p的地址传入函数,假设存储p变量的地址是0x5555,则0x5555这个地址存的是指针变量p的值,也就是Ox5555指向p。
调用的时候同样分配一个临时变量char **s,此时s 的值是&p的值也就是0x5555,但是s所占的空间是另外的空间,只不过它所指向的值是一个地址:Ox5555。
*s=(char *) malloc(100);这一句话的意思是将s所指向的值,也就是0x5555这个位置上的变量的值赋为(char *) malloc(100),而0x5555这个位置上存的是恰好是指针变量p,这样p的值就变成了(char *) malloc(100)的值。即p的值是新分配的这块内存的起始地址。

这个问题理解起来有点绕,关键是理解变量作函数形参调用的时候都是要分配一个副本,不管是传值还是传址。传入后就和形参没有关系了,它不会改变形参的值。myMalloc(p)不会改变p的值,p的值当然是NULL,它只能改变p所指向的内存地址的值。但是myMalloc(&p)为什么就可以了,它不会改变(&p)的值也不可能改变,但是它可以改变(&p)所指向内存地址的值,即p的值。
bigant888 2005-03-22
  • 打赏
  • 举报
回复
程序1:
void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);//传过来的是P所指的地址,并不是P的地址,所以改变S不会改变P
}

void main()
{
char *p=NULL;
myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?
if(p) free(p);
}
程序2:void myMalloc(char **s)
{
*s=(char *) malloc(100);//S指向的是P的地址,所以改变了P所指的内存单元.
}

void main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
程序3:
#include<stdio.h>

void fun(int *p)
{
int b=100;
p=&b;
}

main()
{
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);////道理同第一个程序.
printf("%d\n",*q);
return 0;
}
结果为
10
10
程序4:
#include<stdio.h>

void fun(int *p)
{
*p=100;//参数P和实参P所指的内存单元是相同的.所以改变了参数P的内存单元内容,就改变了实参
//的内存单元内容
}

main()
{
int a=10;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
结果为
10
100
为什么?
bilujun 2005-03-22
  • 打赏
  • 举报
回复
c语言函数参数传递方式是值传递,这是基本概念。
加载更多回复(14)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧