• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            朗朗空間

            我知道并不是 所有鳥兒都飛翔

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              16 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            1.指針變量的聲明和初始化
            指針就是把內(nèi)存地址做為其值的變量。
            (1)指針是一個(gè)變量
            (2)普通變量直接引用了一個(gè)值
            如:

            int a = 3;

            那么a的值就是3。
            (3)指針變量只存放內(nèi)存地址
            (4)指針存放的內(nèi)存地址往往存放有實(shí)際的值,但也可能是另外一個(gè)指針
            如:

            int a = 3;
            int * aptr = &a;//把a(bǔ)的地址通過取地址運(yùn)算符賦給指針變量 aptr
            printf ("%p", aptr);//打印出指針的值,用16進(jìn)制的方式
            printf ("%p", &a);//打印出a的地址,用16進(jìn)制的方式

            (5)指針變量名間接應(yīng)用了一個(gè)值,我們使用間接引用運(yùn)算符來取得具體的值
            printf (”%d”, *aptr);

            (6)指針必須初始化,可以把指針初始化為NULL
            NULL在中定義,它的值是0
            使用NULL使程序具有可讀性。

            注意:
            & 取地址運(yùn)算符 取得任何變量的地址
            如:

            int a;
            int *aptr;
            int c[5];
            //使用&運(yùn)算符取得地址,并打印出來
            printf ("%p\n", &a);//取得整型變量a的內(nèi)存地址
            printf ("%p\n", &aptr);//取得指針變量aptr的內(nèi)存地址
            printf ("%p\n", &c[0]);//取得數(shù)組第一個(gè)元素的內(nèi)存地址

            * 比較讓大家迷惑的是它在這里有兩種不同的用法,但實(shí)際上它們并不是同樣的
            (1)和具體的數(shù)據(jù)類型一起構(gòu)成對應(yīng)的指針類型
            *在聲明語句表示變量是一個(gè)指針

            int *
            float *
            char *
            double *

            (2)間接引用運(yùn)算符

            int a = 3;
            int * aptr = &a;//把a(bǔ)的地址通過取地址運(yùn)算符賦給指針變量 aptr
             
            printf ("%d", *aptr);//通過a的地址間接引用變量a的值

            思考:
            仔細(xì)分析下面的語句的結(jié)果。

            int a = 8;
            int * aPtr;
            aPtr = &a;
             
            printf ("%p\n", & * aPtr);
            printf ("%p\n", * & aPtr);

            提示,一層層分析,可以看做 &(*aPtr)
            答案在最下面。

            二、指針的傳引用調(diào)用
            1.C語言中所有的函數(shù)都是傳值調(diào)用
            為什么,難道指針不是傳引用調(diào)用嗎?
            不是,C語言只是把指針的值拷貝一份,傳如函數(shù)內(nèi)部。
            2.那么傳遞數(shù)組呢?

            void printArray (int *nPtr);

            void printArray (int array[]);

            的效果都是一樣的,都是傳一個(gè)地址進(jìn)去。
            另外,要注意:
            數(shù)組名本身就是地址。
            3.指針的傳引用調(diào)用我們也可稱之為模擬傳引用調(diào)用,因?yàn)槲覀儌鞯氖且粋€(gè)地址,
            函數(shù)調(diào)用時(shí),函數(shù)的參數(shù)會拷貝這個(gè)地址,然后通過復(fù)引用來操作變量。

            int cubeByReference (int * nPtr)//計(jì)算立方
            {
                *
            nptr = *nptr * *nptr * *nptr;
            }

            注意這里,
            (1)*(復(fù)引用運(yùn)算符)比*(乘法運(yùn)算符)優(yōu)先級要高。
            所以可以不適用括號,但是推薦你使用下面的語句,這樣程序更加清晰。
            (2)nPtr是占用堆棧的,函數(shù)cubeByReference會給nPtr這個(gè)指針變量分配空間,
            然后把傳入的指針變量的值賦給它。

            int cubeByReference (int * nPtr)//計(jì)算立方
            {
                
            (*nptr) = (*nptr) * (*nptr) * (*nptr);
            }

            4.傳值為什么不改變傳入變量的值
            因?yàn)樗窃诙褩V猩梢粋€(gè)新的變量,然后把存放的值拷貝過來,最后函數(shù)結(jié)束的時(shí)候把該變量從堆棧中釋

            放掉,所以并不會改變傳入變量的值。
            就像你用一張新的紙把一張紙上的東西復(fù)制一遍,然后在新的紙上寫寫畫畫,然后丟掉,并不會影響到原來

            的紙上的內(nèi)容。
            5.傳指針(也就是傳引用為什么會改變)
            因?yàn)橹羔樈o出了原來變量的地址,使得*(復(fù)引用指針)可以通過這個(gè)地址找到這個(gè)變量并對它進(jìn)行修改。

            三、指針的const限定
            (1)指向非常量數(shù)據(jù)的非常量指針

            int a;
            int b;
            int *aPtr;
            aPtr = &a;//OK
            aPtr = &b;//OK
            *
            aptr = 3;//OK

            (2)指向常量數(shù)據(jù)的非常量指針(不能修改指向變量中的數(shù)據(jù))

            const int * aPtr;

            注意:const 修飾int

            int a;
            int b;
            const int *aPtr;
            aPtr = &a;//OK
            aPtr = &b;//OK
            *
            aptr = 3;//ERROR 不能修改指向的變量中的數(shù)據(jù)

            (3)指向非常量數(shù)據(jù)的常量指針(不能東指西指)

            int * const aPtr;

            注意: const 修飾指針變量 aptr;
            數(shù)組名是一個(gè)很好的例子。(參見字符串?dāng)?shù)組中的說明。)

            int a;
            int b;
            const int *aPtr = &a;
            aPtr = &b;//ERROR  不能再指向另外一個(gè)變量
            *
            aptr = 3;//OK

            (4)指向常量數(shù)據(jù)的常量指針(不能修改指向變量中的數(shù)據(jù),不能東指西指)
            const int * const aPtr;

            int a;
            int b;
            const int * const aPtr = &a;
            aPtr = &b;//ERROR  不能再指向另外一個(gè)變量
            *
            aptr = 3;//ERROR  不能修改指向的變量中的數(shù)據(jù)

            答案:
            1.實(shí)際上*aPtr相當(dāng)于a, &*aPtr就取得a的地址
            2.&aPtr取得aPtr的直至,而*&aPtr就取得aPtr存放的值,也就是a的地址
            3.&*會相互抵消,實(shí)際上&*aPtr == aPtr == *&aPtr

            posted on 2008-05-21 22:35 聶元朗 閱讀(465) 評論(0)  編輯 收藏 引用 所屬分類: C語言學(xué)習(xí)筆記
            久久久久久人妻无码| 日韩欧美亚洲综合久久| 99久久国产亚洲高清观看2024| 国产午夜精品久久久久免费视| 国产成人综合久久久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久亚洲爆乳少妇无| 精品伊人久久久| 亚洲伊人久久大香线蕉苏妲己| 一本色道久久综合| 精品久久久久中文字幕一区| 香蕉久久av一区二区三区| 久久综合九色综合欧美就去吻| 久久综合给合久久狠狠狠97色69 | 伊人久久五月天| 国产精品热久久毛片| 久久99精品久久久久久久久久| 人妻无码久久精品| 精品国产综合区久久久久久 | 欧美粉嫩小泬久久久久久久| 99久久人妻无码精品系列蜜桃| 亚洲国产日韩欧美久久| 久久亚洲av无码精品浪潮| 九九99精品久久久久久| 国产亚洲精品美女久久久| 狠狠精品久久久无码中文字幕 | 国产精品内射久久久久欢欢 | 国产精品一久久香蕉国产线看| 99久久精品免费看国产一区二区三区 | 久久天天躁狠狠躁夜夜网站| 久久精品国产欧美日韩99热| 日韩中文久久| 久久免费视频1| 亚洲乱码精品久久久久..| 久久亚洲精品国产精品| 国内精品伊人久久久久AV影院| 国产精品无码久久久久久| 99999久久久久久亚洲| 国产精品久久精品| 99久久国产热无码精品免费久久久久| 99久久婷婷国产综合精品草原|