一級指針、二級指針做函數參數的深入剖析

在講述內容之前,先講四點重要知識

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的地址,沒有改變。

以上內容純粹個人理解,如有不對之處,歡迎批評指正。
轉載請留言,說明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章