2016-11-06 224 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++)。您只能通過值傳遞,或通過指針傳遞。

在這種情況下,看起來你想要傳遞一個結構數組來作用changeValues。這就是你在main中所做的。但是,您實際嘗試將changeValues的指針數組傳遞給struct ITEM的原型和實現。

一個可能的解決方法是將指針數組更改爲結構ITEM只是結構數組。

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

編輯:實際上,你必須在你的代碼中的其他兩個錯誤:

1)結構ITEM的定義必須是前changeValues原型:

struct ITEM 
{ 
    int number; 
}; 

void changeValues(struct ITEM item[]); 

2)您的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; 
}