2016-05-06 16 views
0

関数が2つのポインタを引数として取り、その関数がポインタのアドレスを変更するプログラムを書いているので、main関数のポインタの値を呼び出すと、値。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 stackoverflowの上の同じ質問に対する回答に基づいています。

私も同じよう関数を定義しようとした: -

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

いいえ、私はmain関数で定義された変数の値を、ポインタと引数を取らない外部関数を使って変更しようとしています。 –

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ように2つのポインタを取り、あなたが本当にことを望んでいた場合、その関数は、ポインタ

のアドレスを変更します、次に:

  • あなたはポインタへのポインタを取る必要があります
  • 意味のあるアドレスを作成するために非一時変数が必要です。

追加した例:

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

OKです。それは最初のものとはまったく異なる何かをしますが、少なくとも働く機会があります。クラッシュする可能性がある唯一の方法は、渡された値が悪い場合です。問題は呼び出し側にあります。あなたは、関数に任意の変数を渡すこの機能でそれを変更し、その新しい値を返すようにしたい場合は

+0

私は理解できません、もっと詳しく説明できますか? –

+4

@SahibNavlani実際、いいえ。あなたがまだ理解していない場合は、戻って本を開き、ポインタについての章をもう一度読んでから、説明に戻ってください。 –

1

は、あなたがそれ()への参照を渡す必要はなく、変数自体()。あなたがdのアドレスを変更したいとm場合

は、具体的にあなたのケースでは、あなたが変更したいアドレスにの参照を渡す必要があります。、

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

しかし、あなたはあなたの方法で主張すれば:

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

し、それに応じては、このようなあなたのmain関数の本体を変更します。これは、あなたの関数は次のように変更しなければならないことを意味します次のように変更する必要があります。

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

このような関数の呼び出しE:

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

ポインタへのポインタの引き渡しは、引き続き値を渡します。ポインタへのポインタは、非ポインタへのポインタと同じくらいの値です。私はあなたが作ろうとしている区別が最高で混乱していて、最悪では間違っていると言いたい。具体的には、 '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); 'は同じです –

関連する問題