2016-05-06 123 views
0

我写了一个程序,其中一个函数采用两个指针作为参数,并且该函数改变了指针的地址,所以当我在主函数中调用指针的值时,它显示的是旧的值。传递指针在C中的功能

代码: -

#include <stdio.h> 

void sample(int *d, int *m); 

int main(){ 
    int day=12,month=3; 
    int *d,*m; 
    d = &day; 
    m = &month; 
    printf("Day = %d \t MOnth = %d\n",*d,*m); 
    sample(d,m); 
    printf("Day = %d \t Month = %d\n",*d,*m); 
} 

void sample(int *d, int *m){ 
    int month = 1; 
    int day = 30; 
    m = &month; 
    d = &day; 
} 

基于答案的计算器我甚至称使用sample(&d,&m)的功能,但同样did'nt工作,同样的问题。

我甚至尝试定义的功能等: -

void sample(int *d,int *m){ 
    int month = 1; 
    int day = 30; 
    *m = month; 
    *d = day; 
} 

但程序崩溃。

+1

你的第二个版本应该工作...如果它坠毁,我估计还会发生其他事情。 – vu1p3n0x

+0

您正在设置函数指针参数的本地副本,以指向函数中的局部变量。这不会改变'main()'中的任何内容。你可以写(在示例函数中)'* d = 30; * m = 1;'(或'* d =日; * m =月;')。 –

回答

0

sample() API中,您正在为指针分配一些新值,这些值仅在示例API中有效,因此您传递指针的目的是保留值需要更改的位置。所以您应该不改变你的指针指向的位置,你只需要改变位置中的值,如下所示。

void sample(int *d,int *m) 
{ 
    int month=1,day = 30;  
    *m = month; 
    *d = day; 
} 
+0

我不明白这个答案 –

+0

@SahibNavlani我可能误会了你的问题。你是否试图改变每月和每天到每月? – Gopi

+2

不,我正在尝试改变主函数中使用指针和外部函数定义的变量的值,它不需要任何争论。 –

0

让我们看看你的函数是这样做的:

void sample(int *d,int *m){ // take a temporary pointer arg 
    int month = 1;   // create a temporary variable 
    m = &month;    // assign the address of the temporary 
          // to the temporary pointer   
} 

一个函数有两个指针作为arguements和功能改变指针

的。如果你真的想要的地址,那么:

  • 你需要指向指针
  • 你需要非临时变量来创建有意义的地址。

你追加例题:

void sample(int *d,int *m) { 
    int month = 1; 
    int day = 30; 
    *m = month; 
    *d = day; 
} 

是确定的;因为它与第一个完全不同,但至少有工作的机会。它可能崩溃的唯一方法是如果传递给它的值不好;所以问题在于调用者。

+0

我不明白,请你详细解释一下。 –

+4

@SahibNavlani其实,没有。如果你现在还没有理解,回去打开你的书,再读一遍关于指针的章节,然后*回来解释。 –

1

当你想要的任何变量传递给一个函数,改变它在这个函数返回它的价值,你需要一个引用传递给它(),不是变量本身()。

特别是在你的情况下,如果你想改变的d和地址m你需要传递引用要更改的地址。这意味着,你的函数应该修改如下:

void sample(int *d,int *m){ 
    *m = 1; 
    *d = 30; 
} 

,并相应修改main功能的这样的身体:

int day=12, month=3; 
sample(&day, &month); 

但是,如果你在你的方式坚持的应进行以下修改:

void sample(int **d, int **m){ 
    int month = 1; 
    int day = 30; 
    *m = &month; 
    *d = &day; 
} 

因此您应该更改Ë这样的函数的调用:

int day=12, month=3; 
int *d, *m; 
d = &day; 
m = &month; 
sample(d,m); 
+0

传递指针指针仍然传递一个值;指向指针的指针与指向非指针的指针一样多。我想说的是,你试图做出的区分最多只会令人困惑,而最坏的情况却是错误的。特别是 - 将'int *'传递给一个传递给int的引用或一个int *的值的函数? –

0

改变函数的调用解决了这个问题

sample(&day,&month); 

新代码: -

#include<stdio.h> 

void sample(int *d,int *m); 

int main(){ 
int day=12,month=3; 
int *d,*m; 
d = &day; 
m = &month; 
printf("Day = %d \t MOnth = %d\n",*d,*m); 
sample(&day,&month); 
printf("Day = %d \t Month = %d\n",*d,*m); 
} 

void sample(int *d,int *m){ 
int month = 1; 
int day = 30; 
*m = month; 
*d = day; 
} 
+1

'sample(&day,&month);'''sample(d,m);'是相同的 –