我知道C總是按值傳遞,但如果我有一個指針:如何將指針傳遞給函數,並將值賦給C中指向的變量?
int i = 4;
int * p;
p = &i;
然後我有一個函數,如何通過指針p
它和改變變量i
的價值?
void changeValue(int *p)
{
}
如何傳遞指針並更改p
指向的變量?
我知道C總是按值傳遞,但如果我有一個指針:如何將指針傳遞給函數,並將值賦給C中指向的變量?
int i = 4;
int * p;
p = &i;
然後我有一個函數,如何通過指針p
它和改變變量i
的價值?
void changeValue(int *p)
{
}
如何傳遞指針並更改p
指向的變量?
這個簡單的例子示出了如何通過一個指針(即,不是一個值),並通過該指針,由整數保持的新值收到回。請注意減少的變量數量。即不需要創建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
一樣好。
int i = 4;
int * p = &i;
changeValue(p);
printf("%d",*p);
void changeValue(int *p)
{
*p = 5;
}
完整程序 - http://ideone.com/DCvhxE
爲什麼不把這個簡短(正確)的示例代碼放到你的答案中?由於它錯過了原型'changeValue()',所以它的狀態並不正確。 – alk
只需通過調用changeValue
作爲
changeValue(p);
它傳遞並通過向*p
在changeValue()
分配值改變可變的由它(i
)指出的值
void changeValue(int *p)
{
*p = an int value;
}
如果您取消引用changeValue
中的指針並將其分配給它,它將在調用幀中更改i
的值。
例如爲:
void changeValue(int *p)
{
*p = 0;
}
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 ;
}
代碼錯過原型'changeValue()'。 – alk
如果函數在C_中的第一個外觀沒有首先用特定的返回類型定義,也就是說返回類型不明確,那麼編譯器假定它將返回int。所以第一次'changeValue(p);'出現在main中,因爲它是不明確的,所以編譯器認爲'int'。然後它在函數定義處被定義爲'void changeValue(int *)'。這導致_redeclaration of function_編譯時錯誤。如果你在'main()'之前的某處添加原型'void changeValue(int *);',你的代碼是完美的。 (我不downvoter,但會upvote如果修復) – ryyker
@alk ::我的錯誤。我以極其沉重的方式回答了這個問題。 – Abhineet
「我知道c總是經過值」你怎麼知道這個? – Abhineet
讀它的地方 – user2131316
感謝您的線路好友。我不知道。我的意思是,我知道通過經驗,一切都被複制,甚至指針的價值,但從來沒有給它一個第二個想法。 – Abhineet