1.要想通過無返回值的函數來修改實參的值,必須傳遞地址
void f(int* p)
{
*p = 100;
}
int main()
{
int a = 9;
f(&a);//無論是什麼類型的變量,此處必須傳遞地址才可通過函數修改其值。表示p = &a,那麼*p就等價於a
printf("a = %d\n", a);
return0;
}
2.跨函數使用內存
題目:下程序中,能夠通過調用函數fun,使main函數中的指針變量p指向一個合法的整型單元的是
A main()
{
int* p;
fun(p);//此處沒傳遞p的地址,所以肯定錯誤
...
}
int fun(int* q)
{
int s;
q = &s;
}
B main()
{
int* p;
fun(&p);
...
}
int fun(int** q)
{
int s;
*q = &s;
}
//看似正確,其實錯誤。p的地址傳給了q,則*q就等價於p,p指向了s,但是變量s只在fun函數內部有效,fun函數執行完後,s這塊內存就被釋放,不是一個合法的整型單元
C main()
{
int* p;
fun(&p);
...
}
int fun(int** q)
{
*q = (int*)malloc(sizeof(int));//正確,malloc分配的內存必須由free進行主動釋放
}
D main()
{
int* p;
fun(p);//沒加取地址,直接判斷錯誤
...
}
int fun(int* q)
{
q = (int*)malloc(sizeof(int));
}