C語言指針專題——使用指針要注意這些

本文爲原創,歡迎轉發:編程

歡迎關注微博與微信號:C語言編程技術分享數組

C語言中,指針的概念有點難懂,使用起來稍微不注意,也會遇到各類問題。在本文中,我列舉出了幾個使用指針不當的方式,但願朋友們在編程實踐中也多多注意。微信

1、野指針
函數

野指針這個東東是常常被人說起的,其危害也是你們有目共睹的。我很早以前寫過一篇文章來講明野指針的,連接是:spa

C程序中可怕的野指針 - 知乎專欄
設計

有興趣的朋友能夠看看,這裏就很少廢話了!指針

2、越界訪問code

越界訪問最多見的就是使用指針訪問數組元素了。好比下面這段代碼:blog

#include <stdio.h>

int main(void)
{
    int number[3] = {1, 2, 3};
    int *p = NULL;

    p = number;

    for(int index = 0;index < 4; index++)
    {
        printf("%d\n", *(p + index));
    }

    return 0;
}

代碼很好理解,就是用一個指針p,逐個訪問數組的每一個元素,並打印出來。ip

當index爲3的時候,p + index此時就越出數組的長度了,那麼*(p + index)訪問的就是數組之外的內容,輸出啥呢?看下面的輸出結果:


最後一個數字,是2293468,這是數組之外的元素。

本例中還好,對數組之外的內容只是讀取一下而已,若是是寫操做的話,會發生什麼,看你的人品了!


3、指針不可相加

兩個指針相加,你見過嗎?相乘呢?看下面的代碼:

#include <stdio.h>

int main(void)
{
    int number[3] = {1, 2, 3};
    int *p = NULL, *q = NULL;

    p = number;
    q = &number[2];
    
    printf("%d\n", p + q);

    return 0;
}

我運行了下,報了一個錯:


先不去管這個錯誤,咱們能夠本身想一想,兩個指針相加,有什麼意義呢?指針的值,也是一個數字,只不過這個數字是別人的一個地址,兩個指針相加,就是兩個地址值相加,確實沒啥意義!

可是若是兩個指針相減呢?如代碼中指針q減去指針p,這個就是有意義了,意義就在於兩個指針相隔幾個int型元素。有興趣的朋友能夠改下代碼看看。

4、多個指針指向同一個常量區域

先上代碼:

#include <stdio.h>

int main(void)
{
    const char *p = "12345";
    const char *q = "12345";
    const char *r = "123456";
      
    printf("%d\n", (p == q));
    printf("%d\n", (p == r));

    return 0;
}

運行下:


從結果中能夠看到,指針p與q的值是同樣的,也就是說,指針p與指針q是指向同一個字符串「12345」,而指針p與指針r就各自指向各自的字符串了。

對於常量字符串「12345」而言,在程序期間,只有本身這一個實體,沒有其它的拷貝,指針p和指針q都指向它,這樣設計能夠節約存儲空間。

5、當心sizeof(指針)的用法

關於sizeof(指針),計算的是指針變量自己佔用的字節數,認識不到這一點,就會鬧出笑話,好比下面的程序:

#include <stdio.h>

void print(int number[])
{
    for(int index = 0;index < sizeof(number) / sizeof(number[0]); index++)
    {
        printf("%d\n", number[index]);
    }
}

int main(void)
{
    int number[3] = {1, 2, 3};
    int *p = NULL;

    p = number;

    print(p);

    return 0;
}

在函數print中,原意是但願經過「sizeof(number) / sizeof(number[0])」來計算出數組的大小,來一個一個輸出數組的元素。可實際上呢,根本不是。運行結果以下:


結果只輸出了一個元素。

函數print的形參number雖然寫的是數組的形式,可是實際上它是一個指針,

sizeof(number) 計算的是指針自己佔用的字節數,爲4;

sizeof(number[0])計算的是int整型變量佔用的字節數,也爲4;

所以for循環只循環了一次就結束了。

我曾經也寫過一篇文章,來說解sizeof(數組)和sizeof(指針)的區別,有興趣的朋友能夠看看:

別混淆了sizeof(數組名)和sizeof(指針) - 知乎專欄

相關文章
相關標籤/搜索