2012-09-06 167 views
4

我试图改变指针最小和最大指针的位置,但似乎“变化”并没有超出函数的范围(函数运行后)。在运行函数之前,我将* min和* max设置为指向“double m = 0”。我是一种NOOB,所以任何意见将不胜感激。c - 传递指向函数的指针

int min_max(double * min , double * max , int size , double a[]){                  
int i;                                 

printf("\n%lg\t%lg\n", *min, *max);                         

min = &a[0];                               
max = &a[0];                               

for (i = 1 ; i < size ; i++) {                           
if (a[i] > *max)                              
    max = &a[i];                              
else if (a[i] < *min)                            
    min = &a[i];                              
}                                  
printf("\n%lg\t%lg\n", *min, *max);                         
return 0;                                
} 
+2

你应该有指针的指针,即通过一个指针的地址。 –

回答

10

如果你发送一个指向双,您允许的是双重改变的内容。如果你想要改变指针,你必须发送一个指针指向指针(double**),它允许改变指针的内容。

int min_max(double ** min , double ** max , int size , double a[]){ 
    int i;                                 

    printf("\n%lg\t%lg\n", **min, **max);                         

    *min = &a[0];                               
    *max = &a[0];                               

    for (i = 1 ; i < size ; i++) {                           
     if (a[i] > **max)                              
      *max = &a[i];                              
     else if (a[i] < **min)                            
      *min = &a[i];                              
    }                                  
    printf("\n%lg\t%lg\n", **min, **max);                         
    return 0;                                
} 

与所有反引用会在这里,它可能是有意义的,以保持两个本地指针甚至只是指数,并在循环结束后设定的返回值。

[编辑]

为什么我不能改变一个函数指针?如果我改为发送一个数组(指针类似的东西)来保留最小值和最大值,例如,minmax [0] = min,minmax [1] = max,则值会改变,否?

那么,有点,但你要求一个指向数组元素,是最小值和最大值,而不是实际值。所以即使你传递了一个数组来实现它,它也必须是一个指针数组(double *minmax[2])。现在,这实际上只是一个double**,它指向两个double*值(您分别将其索引为元素0和1)。所以这是一回事。

现在,为什么你不能改变一个指针?您可以!但是您的更改仅限于您的功能范围内。由于double*指针是按值传递的,因此无法将的值更改回给调用者。在我迷惑你之前,你可能需要做一些阅读传递值和传递参考,但总的想法是这样的:

你发送给一个函数的任何数据类型都被有效地复制了。因此,如果您传递的是double,则将该值从调用方复制到新的内存位置(该函数的参数)。该函数现在没有引用该值的原始位置。

void my_func(double val) { 
    val = 42; // Does not affect caller's value because it was copied 
} 

double value = 1; 
my_func(value); 
// value is still 1 

当您通过double*时也是如此。您正在向该功能发送double值的地址,但实际地址(指针)是一个复制到提供给您的函数的double*中的值。

void my_func(double* val) { 
    *val = 42; // Stuff 42 into the memory location pointed to by 'val'. 
} 

double value = 1; 
my_func(value); 
// value is now 42 

但主叫方似乎想最大值和最小值的阵列内的实际地址(除非这是一个错误,由于是新的指针)。在这种情况下,指针是不够的,因为你正在复制指针的内容。在这里,你需要把握你的指针的内存地址并将其传递给函数。该地址被复制,并且当您引用它时,您可以将指针写入该内存位置。

void my_func(double** val) { 
    *val = *val + 1; // Change the pointer pointed to by 'val'. 
} 

double values[4] = { 1, 2, 3, 42 }; 
double *value = &values[2];   // value points to '3'. 
my_func(&value); 
// value now points to 42 

每当你提供一个指向要被函数改变的值,它被称为通过引用传递。

+0

为什么我不能在函数中改变指针?如果我反而发送一个数组(像指针一样的指针)来保留最小值和最大值,比如minmax [0] = min,minmax [1] = max,则值会改变,否? – csta

+0

@csta我编辑过,试图解释这一点。 – paddy

2

您不能更改指针指向的位置并查看函数外部的更改。既然你已经通过了指针,你可以将指向的指针改为,但是指针本身是按值传递的:你只是在改变副本。

改变自己,你需要的指针传递到指针的指针:

int min_max(double**, double**, int, double); 
3

你的功能应该是

int min_max(double ** min , double ** max , int size , double a[]); 

和调用语句应该是

int *min,*max; 
min_max(&min,&max,...); 
+0

+1提如何打电话=) – paddy