在講述內容之前,先講四點重要知識
1.當傳入參數時,函數形參會立即申請形參的內存空間,函數執行完畢後,形參的內存空間立即釋放掉。
1.指針是存放其他變量地址的變量。指針有自己的內存空間,內存空間存放的是其他變量的地址。
2.指針具體指向誰,要看指針內存空間存放的地址。存放誰的地址就指向誰。
3.函數參數傳參本質:實參傳給形參,都是拷貝.
指針做函數參數的本質剖析,講述四種情況
一、傳變量
#include <iostream>
using namespace std;
#include <cstring>
void change(int value)
{
value = 20;
}
void main()
{
int a = 10;
change(a);
cout << a << endl;
system("pause");
}
爲什麼沒有修改呢?
change(a)傳參時,value申請內存空間,這時有兩個內存空間,a的內存空間內容10拷貝形參value,這時value內存空間的內容爲10,value = 20,修改了value內存空間的內容,a內存空間的內容仍然是10,所以未修改。
二、一級指針——初級
#include <iostream>
using namespace std;
#include <cstring>
void change(int *p)
{
*p = 20;
}
void main()
{
int a = 10;
change(&a);
cout << a << endl;
system("pause");
}
爲什麼修改了?
change(&a)傳參時,指針變量p申請內存空間,這時有兩個內存空間,a的地址拷貝給形參p,p的內存空間存放的是a的地址,即p指向a,*p = 20,即修改p指向的內存空間——a的值。所以修改了。
三、一級指針——高級
void GetMemory(char *p)
{
p = (char *)malloc(sizeof(100));
}
void main()
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");//一級指針產生中斷,因爲沒有分配內存
//二級指針正常
cout << str << endl;
free(str);
system("pause");
}
產生中斷,也就是說上面的程序存在問題,有什麼問題呢?
GetMemory(str)傳參時,指針變量p申請內存空間,這時有兩個內存空間,str的內存空間的內容拷貝給p,即p的內存空間的內容是NULL,p指向空。 p = (char *)malloc(sizeof(100)),在堆上面申請一個100的內存空間,返回這個內存空間的首地址賦值給p,此時p的內存空間的內容爲這個首地址,p指向這塊內存空間,而與str沒有任何關係,str仍然是NULL.因此在strcpy(str, "hello world")時,出現中斷。
四、二級指針
void GetMemory(char* *p)
{
*p = (char *)malloc(sizeof(100));
}
void main()
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");//一級指針產生中斷,因爲沒有分配內存
//二級指針正常
cout << str << endl;
free(str);
system("pause");
}
這個爲什麼拷貝成功了呢?
在講述之前,先注意p是二級指針,*p是一級指針,GetMemory(&str)傳參時,指針變量p申請內存空間,這時有兩個內存空間,str的地址拷貝給p的內存空間,即p的內存空間的內容是str的地址,這時p指向str的內存空間--->p = &str,*p = str,*p 和 str兩個名字,其實是相等的,指向的是同一塊內存空間(上述程序在此時是NULL)。* p = (char *)malloc(sizeof(100)),在堆上面申請一個100的內存空間,返回這個內存空間的首地址賦值給*p;*p是一級指針,*p(str)內存空間就有值了,不再是NULL,內存空間的內容是這個地址,也就是*p和str指向這塊內存空間,這個內存空間可以存放100個變量的地址,所以指針是存放其他變量地址的變量還是對的。接下來的strcpy(str, "hello world")也就成功了,free(str)釋放掉str(*p)所指向的內存空間.請注意,在這個過程中,p的內存空間的地址始終是str的地址,沒有改變。
以上內容純粹個人理解,如有不對之處,歡迎批評指正。
轉載請留言,說明出處。