溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

什么是C語(yǔ)言中指針

發(fā)布時(shí)間:2021-10-12 10:07:47 來(lái)源:億速云 閱讀:130 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“什么是C語(yǔ)言中指針”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目錄
  • 1.指針是什么

  • 2.指針和指針類(lèi)型

  • 3.野指針

    • 3.1野指針成因

    • 3.2如何規(guī)避野指針

  • 4.指針的運(yùn)算

    • 4.1指針±整數(shù)

    • 4.2指針-指針

    • 4.3指針的關(guān)系運(yùn)算

  • 5.指針和數(shù)組

    • 6.二級(jí)指針

      • 7.指針數(shù)組

        1.指針是什么

        初學(xué)者都有一個(gè)疑問(wèn),那就是指針是什么?簡(jiǎn)單的說(shuō),就是通過(guò)它能找到以它為地址的內(nèi)存單元。

        地址指向了一個(gè)確定的內(nèi)存空間,所以地址形象的被稱(chēng)為指針。

        int main()
        {
         int a = 10;
         int* pa = &a;
            
            return 0;
        }
        //pa是用來(lái)存放地址(指針),所以pa是指針變量。

        總結(jié):指針就是變量,用來(lái)存放地址的變量。(存放在指針中的值都被當(dāng)成地址處理)。

        地址是唯一標(biāo)識(shí)一塊空間的。

        指針的大小在32位平臺(tái)是4個(gè)字節(jié),在64位平臺(tái)是8個(gè)字節(jié)。

        2.指針和指針類(lèi)型

        我們知道變量有不同的類(lèi)型(整型、浮點(diǎn)型、字符型等),其實(shí)指針也是有不同類(lèi)型的。

        指針類(lèi)型的意義1:

        指針類(lèi)型決定了指針解引用操作的時(shí)候,一次訪(fǎng)問(wèn)幾個(gè)字節(jié)(訪(fǎng)問(wèn)內(nèi)存的大?。?br/>char* 指針解引用訪(fǎng)問(wèn)1個(gè)字節(jié)
        int* 指針解引用訪(fǎng)問(wèn)四個(gè)字節(jié)

        int main()
        {
         char* pc = &a;
         *pc = 0;
            
         return 0;
        }

        指針類(lèi)型的意義2:

        指針類(lèi)型決定了,指針±整數(shù)的時(shí)候的步長(zhǎng)(指針±整數(shù)的時(shí)候,跳過(guò)幾個(gè)字節(jié))
        int* 指針+1 跳過(guò)四個(gè)字節(jié)
        char* 指針+1 跳過(guò)一個(gè)字節(jié)

        int main()
        {
         int a = 10;
         int* pa = &a;
         char* pc = &a;
        
         printf("%p\n", pa);
         printf("%p\n", pc);
        
         printf("%p\n", pa+1);
         printf("%p\n", pc+1);
        
         return 0;
        }

        3.野指針

        野指針就是指針指向的位置是不可知的(隨機(jī)的、不正確的、沒(méi)有明確限制的)。

        3.1野指針成因

        指針未初始化

        int main()
        {
            int* p;//局部變量指針未初始化,默認(rèn)為隨機(jī)值
            *p = 20;//通過(guò)p中存的隨機(jī)值作為地址,找到一個(gè)空間,這個(gè)空間不屬于我們當(dāng)前的程序
            //就造成了非法訪(fǎng)問(wèn),p就是野指針
            
            return 0;
        }

        指針越界訪(fǎng)問(wèn)

        int main()
        {
            int arr[10] = 0;
            int i = 0;
            int* p = arr;
            
            for(i =0; i <= 10; i++)
            {
                *p = i;
                p++;//當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針
            }
            
            return 0;
        }

        指針指向的空間釋放

        int* test()
        {
            int a = 10;
            return &a;
        }
        
        int main()
        {
            int* p = test();
            printf("%d\n",*p);
            
            return 0;
        }

        3.2如何規(guī)避野指針

        • 指針初始化

        • 小心指針越界

        • 指針指向空間釋放即使置NULL

        • 避免返回局部變量的地址

        • 指針使用之前檢查有效性

        int main()
        {
            int a = 10;
            int* p = &a;//明確地初始化,確定指向
            
            int* p2 = NULL;//不知道一個(gè)指針當(dāng)前應(yīng)該指向哪里時(shí),可以初始化為NULL
            
            return 0;
        }

        4.指針的運(yùn)算

        4.1指針±整數(shù)

        #define N_VALUES 5
        float values[N_VALUES];
        float* vp;
        for(vp = &values[0]; vp < &values[N_VALUES];)
        {
            *vp++ = 0;
        }
        
        int main()
        {
            int arr[10] = {1,2,3,4,5,6,7,8,9,0};
            int* p = &arr[9];
            
            printf("%p\n",p);
            printf("%p\n",p-2);
            
            return 0;
        }

        4.2指針-指針

        指針-指針 得到的數(shù)字的絕對(duì)值是指針和指針之間元素的個(gè)數(shù)

        int main()
        {
         int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
         printf("%d\n", &arr[9] - &arr[0]);
         printf("%d\n", &arr[0] - &arr[9]);
            
         return 0;
        }

        指針-指針 的前提是兩個(gè)指針指向同一塊區(qū)域

        int main()
        {
            int arr[10] = {1,2,3,4,5,6,7,8,9,0};
            char ch[5] = {0};
            printf("%d\n",&arr[9] - &ch[0]);//err
            
            return 0;
        }

        應(yīng)用 求字符串長(zhǎng)度

        int my_strlen(char* s)
        {
         int count = 0;
         char* start = s;
         while(*s!='\0')
         {
          s++;
         }
         return s - start;
        }
        
        int main()
        {
         char arr[] = "abcdef";
         int len = my_strlen(arr);
         printf("%d\n", len);
            
         return 0;
        }

        4.3指針的關(guān)系運(yùn)算

        #define N_VALUES 5
        float values[N_VALUES];
        float *vp;
        for(vp = &values[N_VALUES]; vp > &values[0];)
        {
            *--vp = 0;
        }

        上述程序也可以寫(xiě)成這樣

        for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
        {
            *vp = 0;
        }

        實(shí)際在絕大部分的編譯器上是可以順利完成任務(wù)的,然而我們還是應(yīng)該避免這么寫(xiě),因?yàn)闃?biāo)準(zhǔn)并不保證它可行。

        標(biāo)準(zhǔn)規(guī)定

        允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許與指向第一個(gè)元素之前的那個(gè)內(nèi)存位置的指針進(jìn)行比較。

        5.指針和數(shù)組

        數(shù)組 - 是一塊連續(xù)的空間,放的是相同類(lèi)型的元素

        數(shù)組大小和元素類(lèi)型,元素個(gè)數(shù)有關(guān)系

        指針(變量) - 是一個(gè)變量,放地址

        指針變量的大小 是4(32bit)/8(64bit)個(gè)byte

        數(shù)組名確實(shí)是首元素地址

        但是有兩個(gè)例外:

        • sizeof(數(shù)組名) - 這里的數(shù)組名不是首元素的地址,是表示整個(gè)數(shù)組的,這里計(jì)算的是整個(gè)數(shù)組的大小,單位還是字節(jié)。

        • &數(shù)組名 - 這里的數(shù)組名不是首元素的地址,是表示整個(gè)數(shù)組的,拿到的是整個(gè)數(shù)組的地址

        int main()
        {
         int arr[10] = { 0 };
         int sz = sizeof(arr);
         printf("%d\n", sz);
         return 0;
        }
        int main()
        {
         int arr[10] = { 0 };
         int* p = arr;
         int i = 0;
         int sz = sizeof(arr) / sizeof(arr[0]);
         for (i = 0;i < sz;i++)
         {
          *(p + i) = i;
         }
         for (i = 0;i < sz;i++)
         {
          printf("%d ", *(p + i));
         }
        
         return 0;
        }

        6.二級(jí)指針

        我們都知道,指針變量是變量,是變量就有地址,那么指針變量的地址存放在哪里呢?

        這就是我們要了解的二級(jí)指針。

        int main()
        {
            int a = 10;
            int* p = &a;
            int** pp = &p;//pp就是二級(jí)指針
            **pp = 20;
            printf("%d\n", a);//a = 20
            return 0;
        }

        7.指針數(shù)組

        從名字上來(lái)看,大家覺(jué)得指針數(shù)組是指針還是數(shù)組?

        答案是數(shù)組,是存放指針的數(shù)組。

        整型數(shù)組 - 存放整型的數(shù)組就是整型數(shù)組
        字符數(shù)組 - 存放字符的數(shù)組就是字符數(shù)組
        指針數(shù)組 - 存放指針的數(shù)組就是指針數(shù)組
        int* 整型指針的數(shù)組
        char* 字符指針的數(shù)組

        int main()
        {
         int arr[10];
         char ch[5];
            
         int* parr[5];
         char* pc[6];
        
         return 0;
        }
        
        int main()
        {
         int a = 10;
         int b = 20;
         int c = 30;
         int* parr[3] = { &a,&b,&c };
         for (int i = 0;i < 3;i++)
         {
          printf("%d\n", *(parr[i]));
         }
        
         return 0;
        }

        “什么是C語(yǔ)言中指針”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

        向AI問(wèn)一下細(xì)節(jié)

        免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

        AI