c語言中,指標的概念有點難懂,使用起來稍微不注意,也會遇到各種問題。在本文中,我列舉出了幾個使用指標不當的方式,希望朋友們在程式設計實踐中也多多注意。
一、野指標
c程式中可怕的野指標 - 知乎專欄
有興趣的朋友可以看看,這裡就不多廢話了!
二、越界訪問
越界訪問最常見的就是使用指標訪問陣列元素了。比如下面這段**:
#include int main(void)
; int *p = null;
p = number;
for(int index = 0;index < 4; index++)
return 0;
}
**很好理解,就是用乙個指標p,逐個訪問陣列的每個元素,並列印出來。
當index為3的時候,p + index此時就越出陣列的長度了,那麼*(p + index)訪問的就是陣列以外的內容,輸出啥呢?看下面的輸出結果:
最後乙個數字,是2293468,這是陣列以外的元素。
本例中還好,對陣列以外的內容只是讀取一下而已,如果是寫操作的話,會發生什麼,看你的人品了!
三、指標不可相加
兩個指標相加,你見過嗎?相乘呢?看下面的**:
#include int main(void)
; int *p = null, *q = null;
p = number;
q = &number[2];
printf("%d\n", p + q);
return 0;
}
我執行了下,報了乙個錯:
先不去管這個錯誤,我們可以自己想想,兩個指標相加,有什麼意義呢?指標的值,也是乙個數字,只不過這個數字是別人的乙個位址,兩個指標相加,就是兩個位址值相加,確實沒啥意義!
但是如果兩個指標相減呢?如**中指標q減去指標p,這個就是有意義了,意義就在於兩個指標相隔幾個int型元素。有興趣的朋友可以改下**看看。
四、多個指標指向同乙個常量區域
先上**:
#include int main(void)
執行下:
從結果中可以看到,指標p與q的值是一樣的,也就是說,指標p與指標q是指向同乙個字串「12345」,而指標p與指標r就各自指向各自的字串了。
對於常量字串「12345」而言,在程式期間,只有自己這乙個實體,沒有其它的拷貝,指標p和指標q都指向它,這樣設計可以節約儲存空間。
五、小心sizeof(指標)的用法
關於sizeof(指標),計算的是指標變數本身占用的位元組數,認識不到這一點,就會鬧出笑話,比如下面的程式:
#include void print(int number)
}int main(void)
; 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(指標) - 知乎專欄
C語言指標專題 如何理解指標
小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 最近在研讀c primer plus 5版中文版,老外寫的,還是很經典的,推薦給讀者們,有需要的朋友可以在這裡購買 c primer plus 5版中文版 指標,傳說中是c語言中的乙個難點,且是難點中的難...
C語言指標專題 序
小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 看到好多的c語言初學者學到指標時,都覺得指標怎麼那麼難啊!我也想起了我當時學習指標時遇到的困難,確實很難!到底是教程寫的不好呢,還是老師教的不好呢?我覺得都有。網上搜尋指標講解的資料很多,我也看了不少,不...
指標引數需要注意
void func u16 x,u16 y void main void 這樣的方式很多可能會得到乙個錯誤的a,b值,因為在函式func中,x,y是被當作16位操作的。也就是說a,b的值只有低16位在函式func中被賦值了,高16位維持不變。void func u32 x,u32 y void ma...