?? 教學--第19章 指針一 基本概念.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls19.htm -->
<HTML><HEAD><TITLE>教學--第19章 指針一 基本概念</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3>
<CENTER>
<TABLE height=105 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: ËÎÌå"
width="100%" height=210>
<H2>第十九章 指針一 基本概念</H2>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.1">19.1
指針是什么?</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.2">19.2
指針的大小</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.3">19.3
定義一個指針變量</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.4">19.4
初始化指針變量</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.4.1">19.4.1
指向不明的指針</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.4.2">19.4.2
給指針變量賦值</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.5">19.5 地址解析
及其操作符 *</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.6">19.6 上機實驗一
指向普通變量的指針和指針之間的互相賦值</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.7">19.7
上機實驗二:改變指針所指變量的值,改變指針的指向</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8">19.8
指針的加減操作</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.1">19.8.1
指向數組的指針</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.2">19.8.2
上機實驗三:指向數組的指針</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.3">19.8.3
偏移指針</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.4">19.8.4
上機實驗四:指針的最小移動單位</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.5">19.8.5 指針的 +=
、 -= 、++、 -- 操作</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.6">19.8.6
上機實驗五:指針的前置++與后置++的區別</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.7">19.8.7 *
(地址解析符)與 ++ 的優先級</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.8.8">19.8.8
上機實驗六:指針的 ++與--操作</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls19.htm#19.9">19.9
小結</A>
<P>
<P>
<H3><B><SPAN lang=en-us><A name=19.1>19.1</A> </SPAN>指針是什么?</B></H3>
<P>
<P>當我們說“人”這個詞時,有時指的是“人類”如:“人是一種會笑的動物”,有時則指個體:比如“張三這人”。
<P>
<P>“指針”這個要念也一樣,它可以意指“指針類型”,也可以代表某個具體的“指針變量”。下面我們重點要講的是:“什么叫指針變量”。
<P>
<P>所以這一小節的題目其實應是:“指針變量是什么?”</P>
<P> </P>
<P>“指針變量”是什么?誠如其名,它首先是一個變量。</P>
<P> </P>
<P>變量最重要的特性是什么?那就是它可以存儲一個值。比如:</P>
<P> </P>
<P>下面是三行代碼,行號是我為了表達方便而特意加上的,并不在實際代碼中出現。</P>
<P> </P>
<P><SPAN lang=en-us>(1) int a;</SPAN></P>
<P><SPAN lang=en-us>(2) a = 100;</SPAN></P>
<P><SPAN lang=en-us>(3) a = 200;</SPAN></P>
<P> </P>
<P>第(1)行定義了一個變量:a。現在它存儲的那個值的大小是不定的,因為我們還沒有賦給它具體的值呢。</P>
<P>到了(2)行執行以后,a 就存了一個值,這個值多大?答:100。</P>
<P>這里舉的是一個整型變量,但其實無論是什么類型的變量,都是用來存值的。</P>
<P>并且,變量的值可以在以后改變大小,比如第(3)行,a中存放的值成了200。</P>
<P> </P>
<P>回憶完普通變量的特性,現在說“指針變量”。</P>
<P> </P>
<P>指針也是變量,所以也是用于存儲一個值。重點是,它存儲的這個值,意義有點特別。</P>
<P> </P>
<P>指針存儲的不是普通的一個值,而是另外一個變量的地址。</P>
<P> </P>
<P>一句話:<B>指針是一種用于儲存“另外一個變量的地址”的變量</B>。或者拆成兩句:指針是一個變量,它的值是另外一個變量的地址。</P>
<P> </P>
<P>這就是指針變量與其它的變量的同與不同:<FONT
color=#ff0000>的都是一個變量,都用來存儲一個值;但,指針存放的是另外一個變量的地址</FONT>。</P>
<P>
<P>可以這樣打個比方:
<P>
<P>有一間房子,它的地址是:人民路108號。這個房子相當于一個變量。那么:
<P>一、如果它是普通變量,則房子里可能今天住的是張三,明天住的是李四。張三,李四就是這個變量的值。通過訪問這間房子,我們可以直接找到張三或李四。
<P>
<P>二、如果它是一個指針變量,則房子里不住具體的人,而是放一張紙條,上面寫:“南京東路77號”。
<P>“南京東路77號”是一個什么東西?是一個地址。
<P>通過該地址,我們繼續找,結果在“南京東路77號”里找到張三。
<P>變量的存儲的值可以改變,指針變量的值同樣可以變更:
<P>過一天,我們再去訪問這個房子,紙條變了“珠海路309號”,通過它,我們找到的是另一個人。
<P>
<P>圖解:
<P align=center><IMG height=136 src="教學--第19章 指針一 基本概念.files/pointer.gif"
width=321 border=0>
<P>
<P>能夠說出圖中兩個“20000007”的關系嗎?
<P>
<P>本質就這點不同,同樣是變量,同樣要占用一定大小的內存空間,不同的是普通變量在那個內存里,存儲了一個具體的值;而指針變量存放的是另一個變量的地址。
<P>
<P>不過,什么叫“變量的地址”?只要你是一直跟著我們的課程學習到這里,相信你能明白什么叫變量的“地址”。否則,您可以需要從第一章從頭看起了。
<P>
<P>說到這里,我們其實一直在說的是“指針變量”,而不是“指針類型”。<B>指針也需要類型,它所存儲的那個變量類型,就稱為指針的類型。</B>繼續前面的比方,有一天我們去人民路108號,今天紙條寫著的地址是:“美眉街8號”,于是我們興沖沖地去了……結果“美眉街8號”里住著一頭豬!是不是很失落——我們以為是“人類”,并且是“美眉”,未料卻關著一頭“豬類”?!
<P>
<P>計算機雖然不懂得什么叫“失落”,但為了它的準確性,我們需要事先定義好一個指針到底是放的是什么類型的變量。這個類型通常也當作是該指針的類型。
<P>
<P>“指針變量中存儲某變量的地址”這種說法是不是有些繞?所以有一個簡短的說法:“指針<B>指向</B>某一變量”。
<P> 這種說法的缺陷是不能像第一種說法好樣道出指針的本質。但它確實方便。下面我們將不斷的使用這兩種說法,大家需要知道它們具有相同意義。
<P>
<H3><B><SPAN lang=en-us><A name=19.2>19.2</A> </SPAN>指針的大小</B></H3>
<P>
<P>指針的大小是問:一個指針變量占用多少內存空間?
<P>
<P>分析:既然指針只是要存儲另一個變量的<B>地址</B>,。注意,是存放一變量的地址,而不是存放一個變量本身,所以,不管指針指向什么類型的變量,它的大小總是固定的:只要能放得下一個<B>地址</B>就行!(這是一間只有煙盒大小的“房間”,因為它只需要入一張與著地址的紙條)。
<P>
<P>存放一個地址需要幾個字節?答案是和一個<SPAN lang=en-us> int </SPAN>類型的大小相同:4字節。
<P>
<P>所以,若有:
<P><SPAN lang=en-us>int* pInt;</SPAN>
<P><SPAN lang=en-us>char* pChar;</SPAN>
<P><SPAN lang=en-us>bool* pBool;</SPAN>
<P><SPAN lang=en-us>float* pFloat;</SPAN>
<P><SPAN lang=en-us>double* pDouble;</SPAN>
<P>
<P>則<SPAN lang=en-us>:</SPAN> <SPAN
lang=en-us>sizeof(pInt)</SPAN>、sizeof(pChar)、sizeof(pBool)、<SPAN
lang=en-us>sizeof(pFloat)</SPAN>、sizeof(pDouble)的值全部為:4。
<P>
<P>(你敢拆電腦嗎?拆開電腦,認得硬盤數據線嗎?仔細數數那扁寬的數據線由幾條細線組成?答案:32條,正是<SPAN lang=en-us> 4 *
8</SPAN>)。
<P>
<P>我們這一章有很多上機實驗。這就算是第一個,只是我提供了代碼:請寫一個程序,驗證上面關于<SPAN lang=en-us>sizeof(T
*)</SPAN>的結論。在寫程序之前,務必要先參考一下“數據結構”這一章中<SPAN lang=en-us>sizeof</SPAN>的例子。
<P>
<H3><B><SPAN lang=en-us><A name=19.3>19.3</A> </SPAN>定義一個指針變量</B></H3>
<P>
<P>數據類型<SPAN lang=en-us>* </SPAN> 變量名<SPAN lang=en-us>;</SPAN>
<P>或:
<P>數據類型<SPAN lang=en-us> *</SPAN>變量名<SPAN lang=en-us>;</SPAN>
<P>
<P>和申請一個普通變量相比,只是在數據類型后面多了一個星號。比如:
<P>
<P><SPAN lang=en-us>int* p;</SPAN>
<P>
<P>星號也可以靠在變量名前面,如:
<P>
<P><SPAN lang=en-us>int *p;</SPAN>
<P>
<P>要同時定義多個相同類型的指針,則為:
<P>
<P><SPAN lang=en-us>int *p1, *p2;</SPAN>
<P>
<P>注意,每個變量之前都必須有 * 。
<P>
<H3><B><SPAN lang=en-us><A name=19.4>19.4</A> </SPAN>初始化指針變量</B></H3>
<P>是變量就存在一個初始化的問題。一個不能確定是住著什么人的房間,總是有點恐怖。
<P>
<H4><B><SPAN lang=en-us><A name=19.4.1>19.4.1</A> </SPAN>指向不明的指針</B></H4>
<P>我先定義一個整型指針:
<P><SPAN lang=en-us>int* p; </SPAN>
<P>
<P>現在,p是一個指針,<SPAN lang=en-us>int </SPAN>規定它只能存放<B>整型變量</B>的地址<SPAN
lang=en-us>,</SPAN>而不是其它如字符型,布爾型等等。
<P>我們稱:p 是一個整型指針。
<P>
<P>不過,現在 p<SPAN lang=en-us> </SPAN>指向哪里 (即:<SPAN lang=en-us>p
</SPAN>存儲的是哪個變量的地址 )?
<P>變量在沒有賦值之前,其值不定的。對于指針變量,值不定可以表述為:指向不明。
<P>
<P>重點來了! 一個指向不明的指針,是一個危險的家伙。很多軟件有BUG,其最后的原因,就在這里。
<P>來看看下而的“恐怖片”:
<P>
<TABLE id=AutoNumber1 style="BORDER-COLLAPSE: collapse"
borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="21%" bgColor=#000000><FONT
color=#ffffff>你來到一間陰森森的房間,這房間里有一張紙條</FONT></TD>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -