| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 425 人关注过本帖
标题:这个问题有人知道吗??
只看楼主 加入收藏
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
结帖率:76.92%
收藏
已结贴  问题点数:10 回复次数:4 
这个问题有人知道吗??
一般来说,函数的非指针参数只是供计算而已。对参数的本身值并不会改为。例如:
#include "stdio.h"
/**************定义函数************/
void change(int num){
num=100;
}

main()
{
int num=10;
printf("num=%d\n",num);/**调用函数前数值**/
change(num);/**************调用函数************/
printf("num=%d\n",num);/**调用函数后数值**/
getch();
}
此时两次显示的num的数值并不会改变,都是:num=10。

如果要改变参数的话,可以用这样:

#include "stdio.h"
/**************定义函数************/
void change(int *num){
*num=100;
}

main()
{
int num=10;
printf("num=%d\n",num);/**调用函数前数值**/
change(&num);/**************调用函数************/
printf("num=%d\n",num);/**调用函数后数值**/
getch();
}
由于这个调用的是地址(&num),因此,两次显示的数值便会改变。调用函数前:num=10;调用函数后数值:num=100;
这是因为它赋值时采用了地址的形式:*num=100;这个不难理解!但是如下是为什么:

#include "stdio.h"

/**************定义函数************/
void change(int num[]){

num[0]=100;

}

main()
{
int num[1]={10};

printf("num[0]=%d\n",num[0]);/**调用函数前数值**/

change(num);/**************调用函数************/

printf("num[0]=%d\n",num[0]);/**调用函数后数值**/

getch();
}
这里的赋值并没有采用地址的方式进行:num[0]=100;但是它却还是改变了原来的数值,这是为什么??
难道num[0]代表的也是地址??

有点长,希望有人给出回答。谢谢!












呵呵!

[ 本帖最后由 mashrb 于 2010-7-1 22:28 编辑 ]
2010-07-01 22:26
suntea
Rank: 2
等 级:论坛游民
帖 子:59
专家分:88
注 册:2010-6-24
收藏
得分:0 
数组的首个元素或者数组名可以看做是这个数组的首地址;

这是基础小常识, 我说的可能有点不太对,楼主自己查查资料再;
2010-07-01 22:36
suntea
Rank: 2
等 级:论坛游民
帖 子:59
专家分:88
注 册:2010-6-24
收藏
得分:10 
给你拷贝了一份, 我顺便也复习下.

数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数组的首地址,是一个地址常量。但是在函数声明的形参列表中除外。
比如:
int foo(char a[10]);
在这种情况下这样的声明与
int foo(char a[]);
int foo(char * a);
是等价的,就是说这种情况下,就算你写的是数组的形式,编译器实际处理的时候也当指针来处理(注意指针是变量,形参也是变量,二者刚好对应)。所以在函数foo内部,你对a进行++, --, +=,=之类的带赋值的操作是完全合法的,因为此时a就是一个指针,不是数组名,当你往函数foo里面传入一个已经事先声明的数组的首地址时候,指针a里面的值就是你这个已经声明的数组的首地址,这样你在foo里面就可以对你那个数组进行操作,正是因为C有这个传地址的优点,所以省略了很多不必要的拷贝工作,试想如果没有这个传地址,你传一个有几万个元素的数组进去,那拷贝工作是相当可观的。这样,你该明白了int main(int argc, char ** argv);里面为什么可以对argv进行++操作了,既然“main函数的第二个形参是一个指向字符串的指针数组”,argv出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。楼主,请结合我前面的讲解,仔细体会我前面这句话的意思。国内的教材不知道怎么写的,把别人越讲越晕。如果不明白,尽管发消息问我。
2010-07-01 22:42
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:0 
数组的访问在编译器内容是按地址访问的,与用指针访问是等价的,所以会变。
2010-07-01 23:09
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
谢谢你,明白了。把形参看作另外的一个变量,在调用函数时,只是往这个形参赋值。这点很重要。还有个问题,下次现问!
2010-07-02 12:40
快速回复:这个问题有人知道吗??
数据加载中...
 
   



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

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