站位 编辑中;
直接上代码+注释;
------------------------------------
楼主问 赋值方式有什么不同?
*s='a';//传递给s的一个指向数组s[12]的首地址,也就是数组第一个元素的地址,这里让s[0] = 'a';
s[1]='a';//同上
*(s+2)='a';//同上
y="a";
//这里就重点说一下了.从main函数中我们知道y也是指向数组s的首地址,也就是s[0]的地址;唯一不同的用的是双引号"";
//怎么理解我说不好,你想一下y是指针变量,y里边存的东西是printf("%p",y);而"a"是一个字符串,按着理解,2种不同类型的
//数据相互赋值,编译器会报错的.但是这里没有,是因为字符串"a"的首地址赋值给了指针变量y;这个语法叫什么来的?高人来解释下吧..我说不上来
------------------------------------------
由此便产生了我的问题:
既然y已经指向了字符创"a"的地址,为什么后便输出的时候却打印了 s的内容?
此问题 我也是想了好半天啊,最后用一个苹果贿赂同学,他才含含糊糊的告诉了我,这是实参与形参的问题;楼主还是自己查资料吧,我也半懂不懂呢;
-------------------------最终编辑-----个人理解仅供参考(原创)自己查到的资料才会有深刻印象----------------------
//请一边看代码注释,一边运行程序来理解,,,,,实在是太太太太 抽象了!
程序代码:
#include "stdio.h"
#include "stdlib.h"
int num(char *a,char *b);//方便理解,改一下变量名
//一.这里的char* a,char *b是形参,实参在man函数里的s和y
//二.我的大概意思就是 实参传递给形参的时候,是把实参的值拷贝一份,
//三.存放在新开辟出来的空间内(那个地方时叫栈还是堆?? 高手啊 快来),当子函数运行结束,那个新开辟的空间,就自动释放了,不复存在了
//四.所以在这些子函数中队形参的操作并不能改变实参的值
//五.但是指针特殊,对指针指向内容的操作,是会改变实参的(好好理解一下,太抽象了)
//看懂这道题,务必要先精确的理解指针
//下面按 序号看
int num(char *a,char *b)
{
//2.这里可以知道 a,b的值 是s,y给传进来的,我们看来看一下&a,&b,a,b 是什么东西
printf("//num函数输出内容前加//便于区分\n");
printf("//&a=%p &b = %p\n",&a,&b);
printf("//a=%p b = %p\n",a,b);
//我们会发现这里s = y = a = b
//////////////////////////////////////////////////////
//3.运行一下发现,&s,&y跟&a,&b的值是不一样的!
//这里的解释上看边的二,三
*a='a';//是改变了a指向的内容
a[1]='a';//同上
*(a+2)='a';//同上
//4.重点到了,上边我已经说明是把字符串"a"的地址赋值给了b变量,
//可是b变量是一个形参, 它是由y拷贝了一份给b的,新开辟空间来存放的
//当子函数调用结束,新开辟的空间就被收回了
//所以当我们在man函数的最后看见输出的y时,不要诧异了,没错的
b="a";
//6. b确实指向了 "a" 但是作为形参,他只在本函数内有效,这是他的生命周期,printf()看一下就晓得了
printf("//b = %s\n",b);
return 1;
}
main(){
char s[12]="Lovechina";
char *y=s;
//1. 调用函数前 我们来看一下 &s &y 和s,y里边存是什么东西(这里不能理解,请不要看下去了)
printf("&s = %p &y = %p\n",&s,&y);
printf("s = %p y = %p\n",s,y);
////////////////////////////////////////////////////////////////
num(s,y);//2.到num函数里看
printf("s=%s\ny=%s\n",s,y);
}
[
本帖最后由 suntea 于 2010-7-7 23:17 编辑 ]