2013-10-21 103 views
1

我知道C總是按值傳遞,但如果我有一個指針:如何將指針傳遞給函數,並將值賦給C中指向的變量?

int i = 4; 
int * p; 
p = &i; 

然後我有一個函數,如何通過指針p它和改變變量i的價值?

void changeValue(int *p) 
{ 
} 

如何傳遞指針並更改p指向的變量?

+0

「我知道c總是經過值」你怎麼知道這個? – Abhineet

+1

讀它的地方 – user2131316

+0

感謝您的線路好友。我不知道。我的意思是,我知道通過經驗,一切都被複制,甚至指針的價值,但從來沒有給它一個第二個想法。 – Abhineet

回答

2

這個簡單的例子示出了如何通過一個指針(即,不是一個值),並通過該指針,由整數保持的新值收到回。請注意減少的變量數量。即不需要創建int *p;的單獨副本。在這種情況下,也不需要將p:p = &i;初始化爲i的地址。

int changeValue(int *); 
int main(void) 
{ 
    int i=15; 
    changeValue(&i); 
    return 0; 
} 

int changeValue(int *p) //prototyped to accept int * 
{ 
    return *p = 3; 
} 

如果你想創建擺在首位的指針,並通過該指針,則:I know the c always pass by values是不正確的:

int changeValue(int *); 
int main(void) 
{ 
    int i=15; 
    int *p; 
    p = &i; 
    *p; // *p == 15 at this point 
    //since p is already a pointer, just pass 
    //it as is 
    changeValue(p); 
    return 0; 
} 

int changeValue(int *q) //prototyped to accept int * 
{ 
    return *q = 3; 
} 

要注意,你的發言是非常重要的。對函數進行寫操作比較常見,因爲指針是可以傳遞的,因爲通常指針比實際變量更小,並且傳遞效率更高,特別是在使用大型數組或結構體時。請記住,如果傳遞一個指針,傳遞&i(i的地址)的效果與傳遞p一樣好。

1
int i = 4; 
int * p = &i; 
changeValue(p); 
printf("%d",*p); 

void changeValue(int *p) 
{ 
    *p = 5; 
} 

完整程序 - http://ideone.com/DCvhxE

+0

爲什麼不把這個簡短(正確)的示例代碼放到你的答案中?由於它錯過了原型'changeValue()',所以它的狀態並不正確。 – alk

2

只需通過調用changeValue作爲

changeValue(p); 

它傳遞並通過向*pchangeValue()分配值改變可變的由它(i)指出的值

void changeValue(int *p) 
{ 
    *p = an int value; 
} 
1

如果您取消引用changeValue中的指針並將其分配給它,它將在調用幀中更改i的值。

例如爲:

void changeValue(int *p) 
{ 
    *p = 0; 
} 
2
void changeValue(int*) ; 

int main(void) 
{ 
    int i = 4; // Suppose i is stored at address 1000h 
    int * p;  
    p = &i;  // Now p stores the address of i that is 1000h 

    changeValue(p); // Can also be written as changeValue(&i); 
    // Here you are passing the address of i to changeValue function 

    return 0 ; 
} 

void changeValue(int* p) // Accept a parameter of type int* 
{ 
    *p = 100 ; // store the value 100 at address 1000h 
    return ; 
} 
+2

代碼錯過原型'changeValue()'。 – alk

+2

如果函數在C_中的第一個外觀沒有首先用特定的返回類型定義,也就是說返回類型不明確,那麼編譯器假定它將返回int。所以第一次'changeValue(p);'出現在main中,因爲它是不明確的,所以編譯器認爲'int'。然後它在函數定義處被定義爲'void changeValue(int *)'。這導致_redeclaration of function_編譯時錯誤。如果你在'main()'之前的某處添加原型'void changeValue(int *);',你的代碼是完美的。 (我不downvoter,但會upvote如果修復) – ryyker

+0

@alk ::我的錯誤。我以極其沉重的方式回答了這個問題。 – Abhineet