2016-11-06 3 views
1
#include <stdio.h> 

void changeValues(struct ITEM *item[]); 

struct ITEM 
{ 
int number; 
}; 

int main(void) 
{ 
    struct ITEM items[10]; 
    for (int i = 0; i < 10; i++) 
    { 
     items[i].number = i;//initialize 
     printf("BEFORE:: %d\n", items[i].number); 
    } 

    changeValues(items); 

    for (int i = 0; i < 10; i++) 
    { 
     items[i].number = i; 
     printf("AFTER:: %d\n", items[i].number); 
    } 

    return 0; 
} 

void changeValues(struct ITEM *item[]) 
{ 
    for (int i = 0; i < 10; i++) 
    item[i] -> number += 5; 
} 

構造体の配列を関数に渡そうとしています。関数内の構造体メンバーの値を、値ではなく参照で変更する必要があります。関数が呼び出された後に結果を出力する何らかの奇妙な理由のため、値は関数呼び出しの前と同じままです。構造体の配列を参照によって関数に渡すにはどうすればよいですか?

答えて

1

Cでは、参照渡し(C++など)はできません。値渡し、ポインタ渡ししかできません。

この場合、structの配列を関数changeValuesに渡すと思われます。それはあなたがmainで行うことです。しかし、changeValuesのプロトタイプと実装では、実際には構造体ITEMへのポインタの配列を渡そうとします。

1つの可能な修正は、struct ITEMのポインタの配列をstructの配列に変更することです。

void changeValues(struct ITEM item[]) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     item[i].number += 5; 
    } 
} 

EDIT:で

struct ITEM 
{ 
    int number; 
}; 

void changeValues(struct ITEM item[]); 

2):

1)構造体ITEMの定義はchangeValuesプロトタイプの前にする必要があります:あなたが実際にあなたのコード内の他の二つのミスをしていましたmain()changeValuesのすべての値を実際にリセットしました。基本的には、その関数で行われたすべてが無効になりました。

for (int i = 0; i < 10; i++) 
{ 
    items[i].number = i; // <-- Remove this line as you are resetting the value again here 
    printf("AFTER:: %d\n", items[i].number); 
} 

struct ITEM 
{ 
    int number; 
}; 

void changeValues(struct ITEM item[]); 


int main(void) 
{ 
    struct ITEM items[10]; 
    for (int i = 0; i < 10; i++) 
    { 
     items[i].number = i;//initialize 
     printf("BEFORE:: %d\n", items[i].number); 
    } 

    changeValues(items); 

    for (int i = 0; i < 10; i++) 
    { 
     // items[i].number = i; // <-- Remove this line as you are resetting the value again here 
     printf("AFTER:: %d\n", items[i].number); 
    } 

    return 0; 
} 

void changeValues(struct ITEM items[]) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     items[i].number += 5; 
    } 
} 
+0

は、それは次のようになります「changeValues(項目);」 ? –

+0

ありがとうございます。最高の答え。私のプログラムは働いており、時間通りに課題を提出しました。 –

1

あなたは、ポインタのアドレスを渡すことで、 '参照として渡す' ことができます。ここで

は一例です:私のメインの中の関数を呼び出すときに

int main(void) 
{ 

    char *pA;  /* a pointer to type character */ 
    char *pB;  /* another pointer to type character */ 
    puts(strA); /* show string A */ 
    pA = strA; /* point pA at string A */ 
    puts(pA);  /* show what pA is pointing to */ 
    pB = strB; /* point pB at string B */ 
    putchar('\n');  /* move down one line on the screen */ 
    while(*pA != '\0') /* line A (see text) */ 
    { 
     *pB++ = *pA++; /* line B (see text) */ 
    } 
    *pB = '\0';   /* line C (see text) */ 
    puts(strB);   /* show strB on screen */ 
    return 0; 
} 
関連する問題