程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 解讀 C 語言中的指針,解讀語言指針

解讀 C 語言中的指針,解讀語言指針

編輯:關於C語言

解讀 C 語言中的指針,解讀語言指針


我想對很多學習C語言的新手來說,指針無疑是一個難點。但是,我覺得指針也是C語言特別重要的一個特性。也許,你在除了C和C++以外的編程語言中,很少看到指針。而C++中,也多用引用,而非指針。指針,作為一種高效的工具,可謂是一把雙刃劍——用得好,可以大大提高程序效率,但用的不好,就是很多bug的滋生地。

這或許也是人們對指針褒貶不一的原因吧。就我個人而言,我還是很喜歡這個特性,因為我需要經常和硬件以及一些底層的軟件打交道。這個時候,指針便體現出它獨特的魅力。指針的知識很多,有一本經典的書叫《C和指針》,如果有興趣可以讀一讀。這裡,我主要總結一些如何去解讀指針(說實話這個東西實在是很容易讓人困惑)的方法,一方面給自己做查詢用,另一方面,希望可以給別人一些幫助。

一,基本概念

關於指針的基本概念,我就不詳細介紹了,因為有許多書都介紹的很詳細。這裡我只介紹一部分。指針指向一個地址,而指針本身在大多數系統上都是一個無符號整數(在32bit機上是4byte,在64bit機上是8byte)。下面用一個例子來說明其機制:

在上面的例子中,先定義了一個指針p,它的類型是int,也就是說它只能指向一個int型的變量,而不能指向其他類型的變量。最後我們將a變量的地址賦給p。在這個過程中,涉及到兩個內存塊,一個是存放指針p的內存(用&p可得到內存地址),一個是存放a的值的內存塊(用&a可以得到內存地址)。而第一個內存存的p的值經過賦值語句後也就是&a的值了。另外一個注意點是, *(星號)和變量類型以及變量名之間可以有任意個空格,也可以沒有。比如下面三種方式都是一樣的:

在上面的例子中,先定義了一個指針p,它的類型是int,也就是說它只能指向一個int型的變量,而不能指向其他類型的變量。最後我們將a變量的地址賦給p。在這個過程中,涉及到兩個內存塊,一個是存放指針p的內存(用&p可得到內存地址),一個是存放a的值的內存塊(用&a可以得到內存地址)。而第一個內存存的p的值經過賦值語句後也就是&a的值了。另外一個注意點是, *(星號)和變量類型以及變量名之間可以有任意個空格,也可以沒有。比如下面三種方式都是一樣的:

解讀方法:

看下面一個例子:

二,數組首地址a,&a,&a[0]

注:a,&a,&a[0]的含義雖然不同,但是他們三個的值是相等的!

以int a[3]為例說明:

關於數組首元素的首地址和數組的首地址的區別:其實,數組首元素的首地址和數組首地址的值是相同的,即&a[0]和a(以及&a)是相等的,但是而這含義不一樣。首元素的首地址加1後,是第二個元素的首地址(之所以一直說首地址,是因為有的類型存儲時會占多個地址),但數組的首地址加1後是“下一個數組的地址”,這裡的下一個數組只是為了說明加1時加了整個數組的大小,而不是一個元素的大小。

有一點比較容易混淆:a雖然代表整個數組,但(a+1)卻代表下一個元素的首地址,即和(&a[0]+1)一樣,下一個數組的形式為:(&a+1)。 下面以一個程序來說明:

輸出結果:

說明(下面的行數只計算main函數內有代碼的行):

三,指針數組和數組指針

指針數組: 首先它是一個數組,數組的元素是指針,也成為“存儲指針的數組”。

數組指針: 首先它是一個指針,它指向一個數組,也可以理解為“數組的指針”。 也可以利用前面的“解讀方法”去分析。

四,函數指針和指針函數

函數指針: 指向函數的指針變量。

指針函數: 帶指針的函數,也就是返回指針的函數。

五,指針常量和常量指針

怎麼記?

三~五的萬能鑰匙

其實,關於“指針數組與數組指針、函數指針與指針函數、指針常量與常量指針”的判斷,有一個萬能鑰匙。那就是根據我們強大的中文語法:前邊是修飾詞,後邊才是主語。比如“指針數組”,前面的指針只是修飾詞,後面的數組才是主語,所以它是一個數組。

六,野指針

野指針指沒有確定指向的指針。造成野指針的情況有:

1. 指針變量創建但沒有初始化。

2. 指針p被free或者delete之後,沒有置為NULL。

版權聲明:感謝原作者的辛苦創作,來源:伯樂在線專欄作者 -時間軌跡,鏈接:http://blog.jobbole.com/102052/。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved