2016-05-06 168 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);'是相同的 –