| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1039 人关注过本帖
标题:请问这几句赋值有什么区别吗??很短!
只看楼主 加入收藏
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
结帖率:76.92%
收藏
已结贴  问题点数:10 回复次数:15 
请问这几句赋值有什么区别吗??很短!
#include "stdio.h"

int num(char *s,char *y);
int num(char *s,char *y){
/***************************/   
   *s='a';
   s[1]='a';
   *(s+2)='a';
   y="a";          /*********这4句的赋值在方法上有什么本质的区别吗??***********/
/**************************/  
}

main(){
   
   char s[12]="Lovechina";
   char *y=s;
   num(s,y);
   printf("s=%s\ny=%s\n",s,y);
   getch();
}






希望有高手解释一下。不胜感激!
搜索更多相关主题的帖子: 赋值 
2010-07-07 20:43
suntea
Rank: 2
等 级:论坛游民
帖 子:59
专家分:88
注 册:2010-6-24
收藏
得分:0 
站位 编辑中;
直接上代码+注释;
------------------------------------
楼主问 赋值方式有什么不同?
   *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 编辑 ]
2010-07-07 22:26
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
int num(char *s,char *y){
/***************************/   
   *s='a';
   s[1]='a';
   *(s+2)='a';
   y="a";          /*********这4句的赋值在方法上有什么本质的区别吗??***********/
/**************************/  
}
楼上的说的也差不多了,我这里有另一份(供你参考)
解答如下:
 (char *s,char *y)中的 s,和y 都分别接受了传过来的地址,也就是s现在指向了数组的地址,y也指向了同一个地址.
 *s='a',s[1]='a',*(s+2)='a' ;这3个语句如果转换成统一指针形式就为: *s='a',*(s+1)='a',*(s+2)='a';
转换成同一数组下标的形式为:s[0]='a',s[1]='a',s[2]='a';
对于
y="a",这个只修改了y的指向,而这里的y只是个中间人,对上头的指示不理睬,而去理睬下头的,固然所做的操作,跟上头无关.
顺便回复楼上的:
所以输出跟y="a"无关,即使y="fagaefafgafea",输出照样是
s=aaaechina
y=aaaechina

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-08 10:03
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
谢谢解答。

s[1]='a'    ------   *(s+1)='a'  

s[1]='a'    不是只相当于对变量的简单赋值吗??
*(s+1)='a'  这句却是通过对地址的取值,然后再赋值。 这两句怎么能说是一样的呢??
2010-07-08 12:45
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
看着眼晕。

对于一个数组 你可以用下标形式去访问
也可以用指针形式去访问。

s是数组的首元素地址,s+1是第2个元素的地址,
*表示取消指针引用
*(s+1)就表示数组第2个元素了,自然可以对它赋值。

他们的作用相同,但是实现方法不同。
使用指针访问很灵活,但不安全。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-08 14:54
starjun14
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:266
专家分:136
注 册:2009-4-26
收藏
得分:0 
有点乱~
2010-07-08 16:00
gggui
Rank: 2
来 自:中国海南
等 级:论坛游民
帖 子:33
专家分:22
注 册:2010-4-24
收藏
得分:0 
头晕
2010-07-08 16:45
Jade0709
Rank: 2
等 级:论坛游民
帖 子:14
专家分:15
注 册:2010-7-6
收藏
得分:0 
   *s='a';  
   s[1]='a';
   *(s+2)='a';
   y="a";

首先,前面三个与最后一个不同,最后一个是将字符串“a”赋给y指向的空间,
      而s[1]与*(s+2)其实讨论的就是对数组(或指针)元素访问的的问题,这两种写法(s[i],*(s+i))其实质是一样的,s[i]最后还是要以类似*(s+i)的方式实现
在汇编中有两个概念:基地址、偏移地址。s就相当于基地址,i就是偏移量,那么s[i],i[s],*(s+i),*(i+s)其实质都是一样的,都是对同一个地址的访问。
2010-07-09 10:43
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1686
专家分:4252
注 册:2007-12-27
收藏
得分:10 
以下是引用Jade0709在2010-7-9 10:43:17的发言:

   *s='a';  
   s[1]='a';
   *(s+2)='a';
   y="a";

首先,前面三个与最后一个不同,最后一个是将字符串“a”赋给y指向的空间
      而s[1]与*(s+2)其实讨论的就是对数组(或指针)元素访问的的问题,这两种写法(s,*(s+i))其实质是一样的,s最后还是要以类似*(s+i)的方式实现
在汇编中有两个概念:基地址、偏移地址。s就相当于基地址,i就是偏移量,那么s,i[s],*(s+i),*(i+s)其实质都是一样的,都是对同一个地址的访问。
这个错误一定得纠正:
给指针变量赋值的意思是使该指针不再指向原目标,改为指向新的目标。
在本例中不是将字符串赋值给y指向的空间,而是在内存某处保存该字符串后,使y不再指向原处,改为指向该字符串的首地址。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-07-09 13:55
Jade0709
Rank: 2
等 级:论坛游民
帖 子:14
专家分:15
注 册:2010-7-6
收藏
得分:0 
以下是引用forever74在2010-7-9 13:55:05的发言:

这个错误一定得纠正:
给指针变量赋值的意思是使该指针不再指向原目标,改为指向新的目标。
在本例中不是将字符串赋值给y指向的空间,而是在内存某处保存该字符串后,使y不再指向原处,改为指向该字符串的首地址。
呵呵,那么请问本例中y指向啥的,看看main函数中的初始化吧。y="a",这个语句y的指向是没有变的,函数传过来的y就是指向一个字符串空间的,y="a",只是把字符串"a"复制到此空间。
2010-07-09 15:05
快速回复:请问这几句赋值有什么区别吗??很短!
数据加载中...
 
   



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

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