日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

能否把指针变量本身传递给一个函数?

發(fā)布時間:2025/6/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 能否把指针变量本身传递给一个函数? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
能否把指針變量本身傳遞給一個函數(shù)?
例:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}?
int main()?
{?
char *p2 = “abcdefg”;
fun(p2);?
return 0;?
}
這個函數(shù)調(diào)用,真的把p2 本身傳遞到了fun 函數(shù)內(nèi)部了嗎?
答案:無法把指針變量本身傳遞給一個函數(shù)。


這很像孫悟空拔下一根猴毛變成自己的樣子去忽悠小妖怪。所以fun 函數(shù)實際運行時,用到的都是_p2 這個變量而非p2 本身。如此,我們看下面的例子:?
void GetMemory(char * p, int num)?
{
? p = (char *)malloc(num*sizeof(char));?
}?
int main()?
{?
char *str = NULL;
GetMemory(str,10);?
strcpy(str,”hello”);?
free(str);//free 并沒有起作用,內(nèi)存泄漏
return 0;?
}
在運行strcpy(str,”hello”)語句的時候發(fā)生錯誤。這時候觀察str 的值,發(fā)現(xiàn)仍然為NULL。也就是說str 本身并沒有改變,我們malloc 的內(nèi)存的地址并沒有賦給str,而是賦給了_str。而這個_str 是編譯器自動分配和回收的,我們根本就無法使用。所以想這樣獲取一塊內(nèi)存是不行的。那怎么辦? 兩個辦法:
?第一:用return。?
char * GetMemory(char * p, int num)?
{?
p = (char *)malloc(num*sizeof(char));
return p;
?}?
int main()?
{?
char *str = NULL;?
str = GetMemory(str,10);?
strcpy(str,”hello”);?
free(str);?
return 0;?
}?
這個方法簡單,容易理解。?


第二:用二級指針。
void GetMemory(char ** p, int num)?
{?
*p = (char *)malloc(num*sizeof(char));?
return p;?
}?
int main()?
{?
char *str = NULL;?
GetMemory(&str,10);?
strcpy(str,”hello”);?
free(str);?
return 0;?
}?
注意,這里的參數(shù)是&str 而非str。這樣的話傳遞過去的是str 的地址,是一個值。在函數(shù)內(nèi)部,用鑰匙(“*”)來開鎖:*(&str),其值就是str。所以malloc 分配的內(nèi)存地址是真正賦值給了str 本身。

總結(jié)

以上是生活随笔為你收集整理的能否把指针变量本身传递给一个函数?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。