首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

问一道C语言的题解决办法

2012-04-06 
问一道C语言的题point(char*p){p+3}main{charb[4]{ a , b , c , d }char*pbpoint(p)printf( %c ,

问一道C语言的题
point(char   *p){   p+=3;}

main
{
char   b[4]={ 'a ', 'b ', 'c ', 'd '};
char   *p=b;
point(p);
printf( "%c ",*p);
}
结果为何是a


[解决办法]
char *p=b;
point(p);
传递的是p的拷贝,不是p本身。
书上有的
[解决办法]
你传的是指针的值,不会改变其值,

传递指针的地址过去,这样就可以了:
point(char **p){ *p += 3;}

main
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
point(&p);
printf( "%c ",*p);
}
结果为何是a
[解决办法]
point(char *p){ p+=3;} // p在这里是临时变量,值加3后函数退出,变量也就释放

main
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
point(p); // p指向的地址不会被point函数改变
printf( "%c ",*p);
}

你需要加强对指针的理解..
[解决办法]
传值引用,这样指针值不会改变的。
[解决办法]
#include "stdafx.h "
#include "iostream.h "
void point(char **p){ *p+=3;}//修改地址
int main(int argc, char* argv[])
{
char b[4]={ 'a ', 'b ', 'c ', 'j '};
char *p=b;
point(&p);//把p的地址传上去
printf( "%c ",*p);
int c;
cin> > c;
return 0;
}


[解决办法]
void swap(int *p,int *q)
{
int x;
x=*p;
*p=*q;
*q=x;
}
main()
{int a=1,b=2;
swap(&a,&b);
}
这个程序为何能够实现a与b的互换

为了实现a,b值的交换,把a和b的地址(参数类型 int*) 传给swap函数了
同理,要改变p的值,就要传递p的地址,而p是个指针,所以参数是char** p了
point(char **p){ *p += 3;}

PS: 要是c有引用类型,这类函数就好看多了



[解决办法]
要想改变P的地址就要把P的地址传入,指向指针的指针才能得到指针的地址
[解决办法]
point(p) 相当没起啥作用,最后输出的仍然是b数组首地址的值a
[解决办法]
行参只是传递的指针参数的地址
并不能起到引用的作用
在函数内部
p指针变量又是一个实际分配的变量,p在传递参数时,相当于
做了p = a的地址赋值操作,且函数退出后,参数p已经释放了
此时你打印的还是以前的p=b 内容


[解决办法]
你明白了栈,就明白了为什么是这个结果
[解决办法]
point(char *p){ p+=3;}

main
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
point(p);
printf( "%c ",*p);
}
结果为何是a

结果当然是a,不是 a 就不正确了哦.分析如下:
char *p; p在内存中是有一个地址值的,char *p=b;然后p+=3,*(p+1)= 'c ',*(p+2)= 'd ',*(p+3)回到了b[4]的首地址,所以,*(p+3)= 'a '.
[解决办法]
point(char *p){ p+=3;}

main
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
point(p);
printf( "%c ",*p);
}
结果为何是a

p是一个指针,p是存放b值的地址,*p才是b的值,point(char *p){ p+=3;}这里只改变了p的值,并没有改变b的值
如果调用函数是这样的point(*p),那结果就不是a了,试一下吧
------解决方案--------------------


你可以这么想,如果想改变p所指向的地址
point(char *p){ *p = 'g ';}
那结果肯定是 g
就是说,如果想把p的地址也改了,就要传一个指向p地址的指针


[解决办法]
首先你要明白:指针也是变量,和普通变量没什么区别,都是变量.只不过指针变量中存的是地址,而普通变量存的是值而已.所以:
#include <stdio.h>
void point(char *p)
{
p+=3;
printf( "%c\n ",*p); /* 这里打印d */
}

int main()
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
clrscr();
point(p);
printf( "%c\n ",*p); /* 这里打印a */
getch();
return 0;
}
打印d是因为你通过point(p)把指针变量p值拷贝到了point(char *p)中的指针变量p中了,虽然名字都是p,他们是不一样的,原因是他们在内存中的地址不样,只是存的值一样而已,而这个值就是数组b的首地址.所以point(p)到point(char *p)是值传递,而不是引用传递.然后在point(char *p)中经过p+=3之后, p此时存的值变为数组中字符d的地址,所以会打印d.
在main函数中打印a是因为main中的指针变量p一直存的都是数组b的首地址,虽然经历了point(p),但这个函数调用只是传递的是指针p的值(这个值刚好是一个地址)而已,所以是值拷贝,值拷贝的最大特点就是建立值的一个副本.所以在main函数中会打印a.

楼主一定要明白一点;何谓变量?变量就是以符号形式给出的、该变量的值在内存中的存放位置。所以变量有两重含义,一是变量代表的值;二是变量在内存中的位置,即地址。所以你定义一个变量时,比如 int a = 5;当程序编译时,会在内存的堆栈上给这个变量a分配空间:一定是某个内存地址上存放着a的说明和a的值.
建议学好汇编,汇编在讲寻址时候,你会明白内存到底是怎么会事。
[解决办法]
其实函数执行完后,行参p的值已经加3了, 只是没法传回给main函数里的实参 ,你将返回类型设置为char *point, 在main函数中调用 p=point(p);
就达到要求了
[解决办法]
http://citywanderer.spaces.live.com/blog/cns!D037B4D2CC4E5C3C!245.entry
--------------------------
函数中的参数传递
参数传递有两种方式:值传递和引用传递。只有一种情况下是引用传递,即参数前面有“&”这一地址运算符。其它情况包括含有指针运算符,其实都是值传递,至于这个值是数值或是地址就要看具体情况了。
一、值传递,下面是两个测试程序,看看运行它们会有什么样的结果:
1、(A程序)
#include <iostream>
using namespace std;
void GetMemory(char *p, int num)
{
p = (char *)malloc(num);
strcpy(p, "hello ");
}
int main()
{
char *str = NULL;
GetMemory(str, 100);
cout < < str < < endl;
}
2、(B程序)
#include <iostream>
using namespace std;
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
strcpy(*p, "hello ");
}
int main()
{
char *str = NULL;
GetMemory(&str, 100);
cout < < str < < endl;
}
A程序编译成功,但是运行时出现致命错误;B程序输出的结果是“hello”。两个程序好像差不多,但是结果却差太多。ok,一起来慢慢分析吧。
首先我们可以把函数参数传递看成是一般的赋值语句,A程序中的参数传递可看成char *p = str,B程序char **p = &str。很明显,在A中,指针p和str指向同一个地址空间,这一地址空间地址为NULL也就是说是不存在的,接下来语句p = (char *)malloc(num)使得p重新指向另一个内存地址,请注意,此时指针str并未作任何改变。跳出函数后,执行cout < < str < < endl语句,str未指向任何地址空间,要输出地址空间中的值当然会出错了;再来看程序B,指针p指向指针str的地址空间(注意,指针str这个变量在声明它的时候系统就为它在栈中分配了内存,这里不要将指针变量的地址与指针指向的地址搞混了!),语句*p = (char *)malloc(num)为p指向的指针str重新指向一个地址大小为num的char型字符串,跳出函数后,打印str,结果就是“hello”了。
二、传引用
至于这个,只要明白定义一个变量为引用类型就相当于此变量是别的变量的别名而已,两个变量可以看成是同一变量,再加上上面的分析,就差不多可以搞定引用传递的问题了。
ok,收工……

热点排行