本文爲原創,歡迎轉發:編程
歡迎關注微博與微信號:C語言編程技術分享數組
C語言中,指針的概念有點難懂,使用起來稍微不注意,也會遇到各類問題。在本文中,我列舉出了幾個使用指針不當的方式,但願朋友們在編程實踐中也多多注意。微信
1、野指針
函數
野指針這個東東是常常被人說起的,其危害也是你們有目共睹的。我很早以前寫過一篇文章來講明野指針的,連接是:spa
有興趣的朋友能夠看看,這裏就很少廢話了!指針
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的形參number雖然寫的是數組的形式,可是實際上它是一個指針,
sizeof(number) 計算的是指針自己佔用的字節數,爲4;
sizeof(number[0])計算的是int整型變量佔用的字節數,也爲4;
所以for循環只循環了一次就結束了。
我曾經也寫過一篇文章,來說解sizeof(數組)和sizeof(指針)的區別,有興趣的朋友能夠看看: