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

2021-09-14 01:17:39 字數 2262 閱讀 1935

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...