qingxin111 发表于 2008-9-2 22:47

一个有关函数的简单问题。

为什么#include<stdio.h>
void hanshu(int a){
        a=a+3;
}
int main(){
        int a=5;
        hanshu(a);
        printf("%d",a);
        return 0;
}里输出的还是5,而#include<stdio.h>
void main()
{
  void sort(int array[],int n);
  int a[10],i;
  printf("enter the array\n");
  for(i=0;i<10;i++)
      scanf("%d",&a[i]);
  sort(a,10);
  printf("the sorted array:\n");
  for(i=0;i<10;i++)
      printf("%5d",a[i]);
  printf("\n");
}
  void sort(int array[],int n)
{
  int i,j,k,t;
  for(i=0;i<n-1;i++)
  {
     k=i;
     for(j=i+1;j<n;j++)
         if(array[j]<array[k])
             k=j;
         t=array[k];array[k]=array[i];array[i]=t;
  }
}
里的数组可以通过函数变换值?

mythhaha 发表于 2008-9-2 23:04

不太清楚你想问什么哦

qingxin111 发表于 2008-9-2 23:08

我想问为什么前面哪个程序不会输出8,不是有个函数将a的值加了3吗?后面的函数怎么就可以实现这样的过程?

mythhaha 发表于 2008-9-2 23:13

第一个是值传递,只是把a的值COPY一份传进去,不改变实参a的值,第2个函数是指针传递,传递的是数组的指针,所以能改变数组的值。个人看法 ,我也是新手,不对的地方请高手指点,谢谢

xuqing520 发表于 2008-9-2 23:14

你前面调用的函数是进行传值调用,且你并没对被调函数的值进行返回,而后面的函数是传址调用,所以你前面得到的是5而后面的是8,当你把前面的被调函数类型改为int,并且加return a;则前面的函数同时可输出8.

qingxin111 发表于 2008-9-2 23:39

不可以啊,把函数变成int,加了return还是5.

li笨宝宝 发表于 2008-9-3 00:37

if(array[j]<array[k])
             k=j;
         t=array[k];array[k]=array[i];array[i]=t;
  }
}
请问,(array[j]<array[k])了,为什么K还等于J?还得转换`?
  貌似,这是个调用函数?
  - -

li笨宝宝 发表于 2008-9-3 00:42

int a=5;
    hanshu(a);
    printf("%d",a);
    return 0;


为什么不是return a ;
   上面要返回的值是什么?

JAVA!! 发表于 2008-9-3 01:03

因为
int main(){
int a=5;
hanshu(a);
printf("%d",a);
return 0;
这里的a

void hanshu(int a)
{
    a=a+3;
}
这里的a并不是同一个变量,
你总是认为他们是相等的,其实不然
你可以把
void hanshu(int a)
{
    a=a+3;
}
这里改成
void hanshu(int b)
{
    b=b+3;
}
这样,你就很容易明白.

[[it] 本帖最后由 JAVA!! 于 2008-9-3 01:05 编辑 [/it]]

来无影 发表于 2008-9-3 02:37

第一个是值传递,

wNumberOney 发表于 2008-9-3 09:51

[quote][bo][un]mythhaha[/un] 在 2008-9-2 23:13 的发言:[/bo]

第一个是值传递,只是把a的值COPY一份传进去,不改变实参a的值,第2个函数是指针传递,传递的是数组的指针,所以能改变数组的值。个人看法 ,我也是新手,不对的地方请高手指点,谢谢 [/quote]
鄙人认为他的观点是正确的。

qingxin111 发表于 2008-9-3 11:53

那怎么判断传递的是值还是指针呢???请大虾们举个小例子吧。谢谢!

wNumberOney 发表于 2008-9-3 13:37

回复 12# qingxin111 的帖子

#include <stdio.h>

void ValueReference(int i);//值引用函数
void PointerReference(int* p);//指针引用函数
void main()
{
        int i=3;
        int *p;

    p=&i;
       
        printf("i的地址=%p,p的地址=%p\n",&i,p);
        printf("调用ValueReference函数以后:\n");
        ValueReference(i);
        printf("i的值=%d\n",i);
        printf("调用PointerReference函数以后:\n");
        PointerReference(p);
        printf("i的值=%d\n",i);
}

void ValueReference(int i)
{
        i+=3;
        printf("值传递以后i的地址=%p,",&i,i);
}

void PointerReference(int* p)
{
        *p+=3;
    printf("指针传递以后p的地址=%p,",p);
}
/*
你会发现ValueReference函数中被传过来的参数i的地址已经与主函数中的i的地址不相同,
也就是说ValueReference函数操作的i只是主函数中i的一个副本,该函数只改变了i的副本的值,并没有改变实际i的值;
而PointerReference函数的参数是i的地址,函数修改了p所指向的值,也就修改了i地址所指向的值。
LS,明白否?解释若有不妥之处,请大家指正。
*/

qingxin111 发表于 2008-9-3 18:38

明白了,非常感谢各位帮忙的热心人!

jianyitianxia 发表于 2008-9-3 18:48

一个属于单向传递,一个属于指针;

li012584 发表于 2008-9-3 21:14

第一个是值传递,为单向传递;第二个是地址传递,可以双向传递。原因就是这样简单1·····

页: [1]

编程论坛