網(wǎng)友整理指針的學習方法

字號:

這是我從網(wǎng)上找的,然后整理了一下。希望會對大家有所幫助。
    前言
    指針,一直被認為是C語言中的精華。只有掌握了指針,你才能說你學會了C語言。
    相當初,我是把指針這一章足足看了三遍才算是“學了這一章”下面的文字是阿容
    寫的,對我學習C語言的指針幫助很大。好東西不敢獨享,今天把它貼出來,希望
    大家也會有所幫助。
    第一章。指針的概念?
    指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。
    要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型,指針所指向的
    類型,指針的值或者叫指針所指向的內(nèi)存區(qū),還有指針本身所占據(jù)的內(nèi)存區(qū)。讓
    我們分別說明。
    先聲明幾個指針放著做例子:
    例一:
    (1)int *ptr;
    (2)char *ptr;
    (3)int **ptr;
    (4)int (*ptr);
    (5)int *(*ptr);
    如果看不懂后幾個例子的話,請參閱我前段時間貼出的文章<<如何理解c和c
    ++的復雜類型聲明>>.
    1.指針的類型。
    從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部分就
    是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個指針的
    類型:
    (1)int *ptr; //指針的類型是int *
    (2)char *ptr; //指針的類型是char *
    (3)int **ptr; //指針的類型是int **
    (4)int (*ptr); //指針的類型是int(*)
    (5)int *(*ptr); //指針的類型是int *(*)
    怎么樣?找出指針的類型的方法是不是很簡單?
    2.指針所指向的類型。
    當你通過指針來訪問指針所指向的內(nèi)存區(qū)時,指針所指向的類型決定了編譯
    器將把那片內(nèi)存區(qū)里的內(nèi)容當做什么來看待。
    從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符
    *去掉,剩下的就是指針所指向的類型。例如:
    (1)int *ptr; //指針所指向的類型是int
    (2)char *ptr; //指針所指向的的類型是char
    (3)int **ptr; //指針所指向的的類型是int *
    (4)int (*ptr); //指針所指向的的類型是int()
    (5)int *(*ptr); //指針所指向的的類型是int *()
    在指針的算術(shù)運算中,指針所指向的類型有很大的作用。
    指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C越
    來越熟悉時,你會發(fā)現(xiàn),把與指針攪和在一起的“類型”這個概念分成“指針的
    類型“和”指針所指向的類型“兩個概念,是精通指針的關(guān)鍵點之一。我看了不
    少書,發(fā)現(xiàn)有些寫得差的書中,就把指針的這兩個概念攪在一起了,所以看起書
    來前后矛盾,越看越糊涂。
    3.指針的值,或者叫指針所指向的內(nèi)存區(qū)或地址。
    指針的值是指針本身存儲的數(shù)值,這個值將被編譯器當作一個地址,而不是
    一個一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個32位整數(shù),因為
    32位程序里內(nèi)存地址全都是32位長。
    指針所指向的內(nèi)存區(qū)就是從指針的值所代表的那個內(nèi)存地址開始,長度為si
    zeof(指針所指向的類型)的一片內(nèi)存區(qū)。以后,我們說一個指針的值是XX,就相
    當于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊
    內(nèi)存區(qū)域,就相當于說該指針的值是這塊內(nèi)存區(qū)域的首地址。
    指針所指向的內(nèi)存區(qū)和指針所指向的類型是兩個完全不同的概念。在例一中
    ,指針所指向的類型已經(jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)
    是不存在的,或者說是無意義的。
    以后,每遇到一個指針,都應該問問:這個指針的類型是什么?指針指向的
    類型是什么?該指針指向了哪里?
    4.指針本身所占據(jù)的內(nèi)存區(qū)。
    指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類型)測一下就知道
    了。在32位平臺里,指針本身占據(jù)了4個字節(jié)的長度。
    指針本身占據(jù)的內(nèi)存這個概念在判斷一個指針表達式是否是左值時很有用
    第二章。指針的算術(shù)運算
    指針可以加上或減去一個整數(shù)。指針的這種運算的意義和通常的數(shù)值的加減
    運算的意義是不一樣的。例如:
    例二:
    1.char a;
    2.int *ptr=a;
    ……
    ……
    3.ptr++;
    在上例中,指針ptr的類型是int*,它指向的類型是int,它被初始化為指向整
    形變量a.接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針
    ptr的值加上了sizeof(int),在32位程序中,是被加上了4.由于地址是用字節(jié)做
    單位的,故ptr所指向的地址由原來的變量a的地址向高地址方向增加了4個字節(jié)。
    由于char類型的長度是一個字節(jié),所以,原來ptr是指向數(shù)組a的第0號單元開始的
    四個字節(jié),此時指向了數(shù)組a中從第4號單元開始的四個字節(jié)。
    我們可以用一個指針和一個循環(huán)來遍歷一個數(shù)組,看例子:
    例三:
    例三:
    int array;
    int *ptr=array;
    ……
    //此處略去為整型數(shù)組賦值的代碼。
    ……
    for(i=0;i<20;i++)
    {
    (*ptr)++;
    ptr++;
    }
    這個例子將整型數(shù)組中各個單元的值加1.由于每次循環(huán)都將指針ptr加1,所
    以每次循環(huán)都能訪問數(shù)組的下一個單元。
    再看例子:
    例四:
    1.char a;
    2.int *ptr=a;
    ……
    ……
    3.ptr+=5;
    在這個例子中,ptr被加上了5,編譯器是這樣處理的:將指針ptr的值加上5
    乘sizeof(int),在32位程序中就是加上了5乘4=20.由于地址的單位是字節(jié),故
    現(xiàn)在的ptr所指向的地址比起加5后的ptr所指向的地址來說,向高地址方向移動了
    20個字節(jié)。在這個例子中,沒加5前的ptr指向數(shù)組a的第0號單元開始的四個字節(jié)
    ,加5后,ptr已經(jīng)指向了數(shù)組a的合法范圍之外了。雖然這種情況在應用上會出問
    題,但在語法上卻是可以的。這也體現(xiàn)出了指針的靈活性。
    如果上例中,ptr是被減去5,那么處理過程大同小異,只不過ptr的值是被減
    去5乘sizeof(int),新的ptr指向的地址將比原來的ptr所指向的地址向低地址方
    向移動了20個字節(jié)。
    總結(jié)一下,一個指針ptrold加上一個整數(shù)n后,結(jié)果是一個新的指針ptrnew,
    ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型
    也相同。ptrnew的值將比ptrold的值增加了n乘sizeof(ptrold所指向的類型)個字
    節(jié)。就是說,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向高地址方向移
    動了n乘sizeof(ptrold所指向的類型)個字節(jié)。
    一個指針ptrold減去一個整數(shù)n后,結(jié)果是一個新的指針ptrnew,ptrnew的類
    型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。pt
    rnew的值將比ptrold的值減少了n乘sizeof(ptrold所指向的類型)個字節(jié),就是說
    ,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向低地址方向移動了n乘siz
    eof(ptrold所指向的類型)個字節(jié)。
    第三章。運算符&和*
    這里&是取地址運算符,*是……書上叫做“間接運算符”。
    &a的運算結(jié)果是一個指針,指針的類型是a的類型加個*,指針所指向的類型
    是a的類型,指針所指向的地址嘛,那就是a的地址。
    *p的運算結(jié)果就五花八門了??傊?p的結(jié)果是p所指向的東西,這個東西有這
    些特點:它的類型是p指向的類型,它所占用的地址是p所指向的地址。
    例五:
    int a=12;
    int b;
    int *p;
    int **ptr;
    p=&a;//&a的結(jié)果是一個指針,類型是int*,指向的類型是int,指向的地址
    是a的地址。
    *p=24;//*p的結(jié)果,在這里它的類型是int,它所占用的地址是p所指向的地
    址,顯然,*p就是變量a.
    ptr=&p;//&p的結(jié)果是個指針,該指針的類型是p的類型加個*,在這里是int
    **.該指針所指向的類型是p的類型,這里是int*.該指針所指向的地址就是指針
    p自己的地址。
    *ptr=&b;//*ptr是個指針,&b的結(jié)果也是個指針,且這兩個指針的類型和所
    指向的類型是一樣的,所以用&b來給*ptr賦值就是毫無問題的了。
    **ptr=34;//*ptr的結(jié)果是ptr所指向的東西,在這里是一個指針,對這個指
    針再做一次*運算,結(jié)果就是一個int類型的變量。
    第四章。指針表達式。
    一個表達式的最后結(jié)果如果是一個指針,那么這個表達式就叫指針表達式。
    下面是一些指針表達式的例子:
    例六:
    int a,b;
    int array ;
    int *pa;
    pa=&a;//&a是一個指針表達式。
    int **ptr=&pa;//&pa也是一個指針表達式。
    *ptr=&b;//*ptr和&b都是指針表達式。
    pa=array;
    pa++;//這也是指針表達式。
    例七:
    char *arr;
    char **parr=arr;//如果把arr看作指針的話,arr也是指針表達式
    char *str;
    str=*parr;//*parr是指針表達式
    str=*(parr+1);//*(parr+1)是指針表達式
    str=*(parr+2);//*(parr+2)是指針表達式
    由于指針表達式的結(jié)果是一個指針,所以指針表達式也具有指針所具有的四
    個要素:指針的類型,指針所指向的類型,指針指向的內(nèi)存區(qū),指針自身占據(jù)的
    內(nèi)存。
    好了,當一個指針表達式的結(jié)果指針已經(jīng)明確地具有了指針自身占據(jù)的內(nèi)存
    的話,這個指針表達式就是一個左值,否則就不是一個左值。
    在例七中,&a不是一個左值,因為它還沒有占據(jù)明確的內(nèi)存。*ptr是一個左
    值,因為*ptr這個指針已經(jīng)占據(jù)了內(nèi)存,其實*ptr就是指針pa,既然pa已經(jīng)在內(nèi)
    存中有了自己的位置,那么*ptr當然也有了自己的位置。
    。
    一個表達式的最后結(jié)果如果是一個指針,那么這個表達式就叫指針表達式。
    下面是一些指針表達式的例子:
    例六:
    int a,b;
    int array ;
    int *pa;
    pa=&a;//&a是一個指針表達式。
    int **ptr=&pa;//&pa也是一個指針表達式。
    *ptr=&b;//*ptr和&b都是指針表達式。
    pa=array;
    pa++;//這也是指針表達式。
    例七:
    char *arr;
    char **parr=arr;//如果把arr看作指針的話,arr也是指針表達式
    char *str;
    str=*parr;//*parr是指針表達式
    str=*(parr+1);//*(parr+1)是指針表達式
    str=*(parr+2);//*(parr+2)是指針表達式
    由于指針表達式的結(jié)果是一個指針,所以指針表達式也具有指針所具有的四
    個要素:指針的類型,指針所指向的類型,指針指向的內(nèi)存區(qū),指針自身占據(jù)的
    內(nèi)存。
    好了,當一個指針表達式的結(jié)果指針已經(jīng)明確地具有了指針自身占據(jù)的內(nèi)存
    的話,這個指針表達式就是一個左值,否則就不是一個左值。
    在例七中,&a不是一個左值,因為它還沒有占據(jù)明確的內(nèi)存。*ptr是一個左
    值,因為*ptr這個指針已經(jīng)占據(jù)了內(nèi)存,其實*ptr就是指針pa,既然pa已經(jīng)在內(nèi)
    存中有了自己的位置,那么*ptr當然也有了自己的位置。
     這是我從網(wǎng)上找的,然后整理了一下。希望會對大家有所幫助。
    前言
    指針,一直被認為是C語言中的精華。只有掌握了指針,你才能說你學會了C語言。
    相當初,我是把指針這一章足足看了三遍才算是“學了這一章”下面的文字是阿容
    寫的,對我學習C語言的指針幫助很大。好東西不敢獨享,今天把它貼出來,希望
    大家也會有所幫助。
    第一章。指針的概念?
    指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。
    要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型,指針所指向的
    類型,指針的值或者叫指針所指向的內(nèi)存區(qū),還有指針本身所占據(jù)的內(nèi)存區(qū)。讓
    我們分別說明。
    先聲明幾個指針放著做例子:
    例一:
    (1)int *ptr;
    (2)char *ptr;
    (3)int **ptr;
    (4)int (*ptr);
    (5)int *(*ptr);
    如果看不懂后幾個例子的話,請參閱我前段時間貼出的文章<<如何理解c和c
    ++的復雜類型聲明>>.
    1.指針的類型。
    從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部分就
    是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個指針的
    類型:
    (1)int *ptr; //指針的類型是int *
    (2)char *ptr; //指針的類型是char *
    (3)int **ptr; //指針的類型是int **
    (4)int (*ptr); //指針的類型是int(*)
    (5)int *(*ptr); //指針的類型是int *(*)
    怎么樣?找出指針的類型的方法是不是很簡單?
    2.指針所指向的類型。
    當你通過指針來訪問指針所指向的內(nèi)存區(qū)時,指針所指向的類型決定了編譯
    器將把那片內(nèi)存區(qū)里的內(nèi)容當做什么來看待。
    從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符
    *去掉,剩下的就是指針所指向的類型。例如:
    (1)int *ptr; //指針所指向的類型是int
    (2)char *ptr; //指針所指向的的類型是char
    (3)int **ptr; //指針所指向的的類型是int *
    (4)int (*ptr); //指針所指向的的類型是int()
    (5)int *(*ptr); //指針所指向的的類型是int *()
    在指針的算術(shù)運算中,指針所指向的類型有很大的作用。
    指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C越
    來越熟悉時,你會發(fā)現(xiàn),把與指針攪和在一起的“類型”這個概念分成“指針的
    類型“和”指針所指向的類型“兩個概念,是精通指針的關(guān)鍵點之一。我看了不
    少書,發(fā)現(xiàn)有些寫得差的書中,就把指針的這兩個概念攪在一起了,所以看起書
    來前后矛盾,越看越糊涂。
    3.指針的值,或者叫指針所指向的內(nèi)存區(qū)或地址。
    指針的值是指針本身存儲的數(shù)值,這個值將被編譯器當作一個地址,而不是
    一個一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個32位整數(shù),因為
    32位程序里內(nèi)存地址全都是32位長。
    指針所指向的內(nèi)存區(qū)就是從指針的值所代表的那個內(nèi)存地址開始,長度為si
    zeof(指針所指向的類型)的一片內(nèi)存區(qū)。以后,我們說一個指針的值是XX,就相
    當于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊
    內(nèi)存區(qū)域,就相當于說該指針的值是這塊內(nèi)存區(qū)域的首地址。
    指針所指向的內(nèi)存區(qū)和指針所指向的類型是兩個完全不同的概念。在例一中
    ,指針所指向的類型已經(jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)
    是不存在的,或者說是無意義的。
    以后,每遇到一個指針,都應該問問:這個指針的類型是什么?指針指向的
    類型是什么?該指針指向了哪里?
    4.指針本身所占據(jù)的內(nèi)存區(qū)。
    指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類型)測一下就知道
    了。在32位平臺里,指針本身占據(jù)了4個字節(jié)的長度。
    指針本身占據(jù)的內(nèi)存這個概念在判斷一個指針表達式是否是左值時很有用
    第二章。指針的算術(shù)運算
    指針可以加上或減去一個整數(shù)。指針的這種運算的意義和通常的數(shù)值的加減
    運算的意義是不一樣的。例如:
    例二:
    1.char a;
    2.int *ptr=a;
    ……
    ……
    3.ptr++;
    在上例中,指針ptr的類型是int*,它指向的類型是int,它被初始化為指向整
    形變量a.接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針
    ptr的值加上了sizeof(int),在32位程序中,是被加上了4.由于地址是用字節(jié)做
    單位的,故ptr所指向的地址由原來的變量a的地址向高地址方向增加了4個字節(jié)。
    由于char類型的長度是一個字節(jié),所以,原來ptr是指向數(shù)組a的第0號單元開始的
    四個字節(jié),此時指向了數(shù)組a中從第4號單元開始的四個字節(jié)。
    我們可以用一個指針和一個循環(huán)來遍歷一個數(shù)組,看例子:
    例三:
    例三:
    int array;
    int *ptr=array;
    ……
    //此處略去為整型數(shù)組賦值的代碼。
    ……
    for(i=0;i<20;i++)
    {
    (*ptr)++;
    ptr++;
    }
    這個例子將整型數(shù)組中各個單元的值加1.由于每次循環(huán)都將指針ptr加1,所
    以每次循環(huán)都能訪問數(shù)組的下一個單元。
    再看例子:
    例四:
    1.char a;
    2.int *ptr=a;
    ……
    ……
    3.ptr+=5;
    在這個例子中,ptr被加上了5,編譯器是這樣處理的:將指針ptr的值加上5
    乘sizeof(int),在32位程序中就是加上了5乘4=20.由于地址的單位是字節(jié),故
    現(xiàn)在的ptr所指向的地址比起加5后的ptr所指向的地址來說,向高地址方向移動了
    20個字節(jié)。在這個例子中,沒加5前的ptr指向數(shù)組a的第0號單元開始的四個字節(jié)
    ,加5后,ptr已經(jīng)指向了數(shù)組a的合法范圍之外了。雖然這種情況在應用上會出問
    題,但在語法上卻是可以的。這也體現(xiàn)出了指針的靈活性。
    如果上例中,ptr是被減去5,那么處理過程大同小異,只不過ptr的值是被減
    去5乘sizeof(int),新的ptr指向的地址將比原來的ptr所指向的地址向低地址方
    向移動了20個字節(jié)。
    總結(jié)一下,一個指針ptrold加上一個整數(shù)n后,結(jié)果是一個新的指針ptrnew,
    ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型
    也相同。ptrnew的值將比ptrold的值增加了n乘sizeof(ptrold所指向的類型)個字
    節(jié)。就是說,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向高地址方向移
    動了n乘sizeof(ptrold所指向的類型)個字節(jié)。
    一個指針ptrold減去一個整數(shù)n后,結(jié)果是一個新的指針ptrnew,ptrnew的類
    型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。pt
    rnew的值將比ptrold的值減少了n乘sizeof(ptrold所指向的類型)個字節(jié),就是說
    ,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向低地址方向移動了n乘siz
    eof(ptrold所指向的類型)個字節(jié)。
    第三章。運算符&和*
    這里&是取地址運算符,*是……書上叫做“間接運算符”。
    &a的運算結(jié)果是一個指針,指針的類型是a的類型加個*,指針所指向的類型
    是a的類型,指針所指向的地址嘛,那就是a的地址。
    *p的運算結(jié)果就五花八門了??傊?p的結(jié)果是p所指向的東西,這個東西有這
    些特點:它的類型是p指向的類型,它所占用的地址是p所指向的地址。
    例五:
    int a=12;
    int b;
    int *p;
    int **ptr;
    p=&a;//&a的結(jié)果是一個指針,類型是int*,指向的類型是int,指向的地址
    是a的地址。
    *p=24;//*p的結(jié)果,在這里它的類型是int,它所占用的地址是p所指向的地
    址,顯然,*p就是變量a.
    ptr=&p;//&p的結(jié)果是個指針,該指針的類型是p的類型加個*,在這里是int
    **.該指針所指向的類型是p的類型,這里是int*.該指針所指向的地址就是指針
    p自己的地址。
    *ptr=&b;//*ptr是個指針,&b的結(jié)果也是個指針,且這兩個指針的類型和所
    指向的類型是一樣的,所以用&b來給*ptr賦值就是毫無問題的了。
    **ptr=34;//*ptr的結(jié)果是ptr所指向的東西,在這里是一個指針,對這個指
    針再做一次*運算,結(jié)果就是一個int類型的變量。
    第四章。指針表達式。
    一個表達式的最后結(jié)果如果是一個指針,那么這個表達式就叫指針表達式。
    下面是一些指針表達式的例子:
    例六:
    int a,b;
    int array ;
    int *pa;
    pa=&a;//&a是一個指針表達式。
    int **ptr=&pa;//&pa也是一個指針表達式。
    *ptr=&b;//*ptr和&b都是指針表達式。
    pa=array;
    pa++;//這也是指針表達式。
    例七:
    char *arr;
    char **parr=arr;//如果把arr看作指針的話,arr也是指針表達式
    char *str;
    str=*parr;//*parr是指針表達式
    str=*(parr+1);//*(parr+1)是指針表達式
    str=*(parr+2);//*(parr+2)是指針表達式
    由于指針表達式的結(jié)果是一個指針,所以指針表達式也具有指針所具有的四
    個要素:指針的類型,指針所指向的類型,指針指向的內(nèi)存區(qū),指針自身占據(jù)的
    內(nèi)存。
    好了,當一個指針表達式的結(jié)果指針已經(jīng)明確地具有了指針自身占據(jù)的內(nèi)存
    的話,這個指針表達式就是一個左值,否則就不是一個左值。
    在例七中,&a不是一個左值,因為它還沒有占據(jù)明確的內(nèi)存。*ptr是一個左
    值,因為*ptr這個指針已經(jīng)占據(jù)了內(nèi)存,其實*ptr就是指針pa,既然pa已經(jīng)在內(nèi)
    存中有了自己的位置,那么*ptr當然也有了自己的位置。
    。
    一個表達式的最后結(jié)果如果是一個指針,那么這個表達式就叫指針表達式。
    下面是一些指針表達式的例子:
    例六:
    int a,b;
    int array ;
    int *pa;
    pa=&a;//&a是一個指針表達式。
    int **ptr=&pa;//&pa也是一個指針表達式。
    *ptr=&b;//*ptr和&b都是指針表達式。
    pa=array;
    pa++;//這也是指針表達式。
    例七:
    char *arr;
    char **parr=arr;//如果把arr看作指針的話,arr也是指針表達式
    char *str;
    str=*parr;//*parr是指針表達式
    str=*(parr+1);//*(parr+1)是指針表達式
    str=*(parr+2);//*(parr+2)是指針表達式
    由于指針表達式的結(jié)果是一個指針,所以指針表達式也具有指針所具有的四
    個要素:指針的類型,指針所指向的類型,指針指向的內(nèi)存區(qū),指針自身占據(jù)的
    內(nèi)存。
    好了,當一個指針表達式的結(jié)果指針已經(jīng)明確地具有了指針自身占據(jù)的內(nèi)存
    的話,這個指針表達式就是一個左值,否則就不是一個左值。
    在例七中,&a不是一個左值,因為它還沒有占據(jù)明確的內(nèi)存。*ptr是一個左
    值,因為*ptr這個指針已經(jīng)占據(jù)了內(nèi)存,其實*ptr就是指針pa,既然pa已經(jīng)在內(nèi)
    存中有了自己的位置,那么*ptr當然也有了自己的位置。