能否把指针变量本身传递给一个函数?
生活随笔
收集整理的這篇文章主要介紹了
能否把指针变量本身传递给一个函数?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
能否把指針變量本身傳遞給一個(gè)函數(shù)?
例:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}?
int main()?
{?
char *p2 = “abcdefg”;
fun(p2);?
return 0;?
}
這個(gè)函數(shù)調(diào)用,真的把p2 本身傳遞到了fun 函數(shù)內(nèi)部了嗎?
答案:無法把指針變量本身傳遞給一個(gè)函數(shù)。
這很像孫悟空拔下一根猴毛變成自己的樣子去忽悠小妖怪。所以fun 函數(shù)實(shí)際運(yùn)行時(shí),用到的都是_p2 這個(gè)變量而非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;?
}
在運(yùn)行strcpy(str,”hello”)語句的時(shí)候發(fā)生錯(cuò)誤。這時(shí)候觀察str 的值,發(fā)現(xiàn)仍然為NULL。也就是說str 本身并沒有改變,我們malloc 的內(nèi)存的地址并沒有賦給str,而是賦給了_str。而這個(gè)_str 是編譯器自動(dòng)分配和回收的,我們根本就無法使用。所以想這樣獲取一塊內(nèi)存是不行的。那怎么辦? 兩個(gè)辦法:
?第一:用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;?
}?
這個(gè)方法簡(jiǎn)單,容易理解。?
第二:用二級(jí)指針。
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 的地址,是一個(gè)值。在函數(shù)內(nèi)部,用鑰匙(“*”)來開鎖:*(&str),其值就是str。所以malloc 分配的內(nèi)存地址是真正賦值給了str 本身。
例:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}?
int main()?
{?
char *p2 = “abcdefg”;
fun(p2);?
return 0;?
}
這個(gè)函數(shù)調(diào)用,真的把p2 本身傳遞到了fun 函數(shù)內(nèi)部了嗎?
答案:無法把指針變量本身傳遞給一個(gè)函數(shù)。
這很像孫悟空拔下一根猴毛變成自己的樣子去忽悠小妖怪。所以fun 函數(shù)實(shí)際運(yùn)行時(shí),用到的都是_p2 這個(gè)變量而非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;?
}
在運(yùn)行strcpy(str,”hello”)語句的時(shí)候發(fā)生錯(cuò)誤。這時(shí)候觀察str 的值,發(fā)現(xiàn)仍然為NULL。也就是說str 本身并沒有改變,我們malloc 的內(nèi)存的地址并沒有賦給str,而是賦給了_str。而這個(gè)_str 是編譯器自動(dòng)分配和回收的,我們根本就無法使用。所以想這樣獲取一塊內(nèi)存是不行的。那怎么辦? 兩個(gè)辦法:
?第一:用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;?
}?
這個(gè)方法簡(jiǎn)單,容易理解。?
第二:用二級(jí)指針。
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 的地址,是一個(gè)值。在函數(shù)內(nèi)部,用鑰匙(“*”)來開鎖:*(&str),其值就是str。所以malloc 分配的內(nèi)存地址是真正賦值給了str 本身。
總結(jié)
以上是生活随笔為你收集整理的能否把指针变量本身传递给一个函数?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: main 函数内的变量是全局变量,还是局
- 下一篇: 对静态区,栈,堆的理解