?? 教學--第二十一章 指針 三 實例演練與提高.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls21.htm -->
<HTML><HEAD><TITLE>教學--第二十一章 指針 三 實例演練與提高</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>第二十一章 指針 三 <SPAN lang=zh-cn>實例演練與提高</SPAN></H2>
<P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#21.1">21.1 <SPAN
lang=zh-cn>簡單變量、數組、指針</SPAN></A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.2
小王成績管理系統V2.0 的問題</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.2.1
軟件升級歷史</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.3
指針的最常用用法</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.3.1
分配內存</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.3.2
訪問指針指向的內存</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.4
小王成績管理系統 V3.0</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.5
字符串指針</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.5.1
為字符串分配指定大小的空間</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.5.2
字符串常用函數</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.5.2.1
字符串比較</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.5.2.2
字符串復制</A>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.6
指針數組</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.6.1
什么叫“指針數組”?</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.6.2
指針數組實例一</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.6.3
指針數組實例二</A>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls21.htm#20.1.1">21.6.4
字符串指針數組 </A>
<P>
<P>
<H3><B><A name=21.1>21.1</A> 簡單變量、數組、指針</B></H3>
<P>學習的知識點越來越多了……
<P>剛開始會覺得很興奮啊,學得越多越好嘛。可慢慢的就會感到壓力了,各種知識點在頭腦里混在一起,每個都變得模糊了。
<P>其實,每個知識點都有它存在,或出現的理由,只要我們多做對比,就會發現學習的知識點越多,反倒越容易理解每個知識點本質。
<P>比如說,簡單變量、數組、指針,三者都是C++中用于表達數據的工具,但在表達能力上,又各有不同。
<P>如果用建筑上的房間來比喻:
<P>
<P>簡單變量是一間房屋。優點是占用空間少,建筑時間短,缺點是一間房子只適于住一個人;
<P>數組是房間數固定的一排房子,每個房子里頭同樣只住一人,但由于它有多間,所以適于多人居住,優點是可以統一管理多人,缺點一來是占用空間大,二來房間數一旦確定,就不能改變了。先頭蓋了10間,如果如果來了11個人,就有一人住不下,如果來了9個人,就有一間浪費。
<P>指針呢……它不是實際房子,而是設計紙上的房子。因此,它首先有一個特點:如果你想讓指針存儲數據,那一定得先為它分配內存。這就像光有一張設計藍圖是解決不了四代同堂的問題的,重要的是你還得根據這張藍圖,去找塊地皮蓋好房子。指針的優點是可以臨時決定要蓋多少間房子。
<P>下面我們回顧一個例子,以理解三者的不同用處。
<P>
<H3><B><A name=21.2>21.2</A> 小王成績管理系統V2.0的問題</B></H3>
<P>先回顧一下該程序的升級過程,今天我們將對它做出兩種不同方向的改進。
<H4><A name=21.2.1>21.2.1</A> 軟件升級歷史</H4>
<P><SPAN lang=en-us>V1.0 : </SPAN>本版成績管理系統實現讓計算機自動統計6個班級的成績總分和平均分。
<P><SPAN lang=en-us>V2.0 :
</SPAN>經過改進,本版可以實現多達5000個學生的成績進行求總分和平均分,并且可以支持用戶輸入序號,查詢任意一個學生的成績!
<P>
<P>在第一版,小王正在學習“循環流程”。通過在每次循環中,讓用戶輸入一個成績,然后保存在一個簡單變量里,并累加到另一個簡單變量,最終計算出總分和平均分。
<P>第二版,由于段長要求不僅可以統計5000個學員的成績,而且應實現成績查詢功能,這就要求程序必須同時記下5000個學生成績。小王先是想用5000個簡單變量來記下成績——這顯然太不實際了,后來學到數組,用數組輕松解決了這個問題,因為數組正是為“同時存儲多個相同類型的變量”這一問題來設計的。
<P>然而,第二版存在的不足也是顯然易見的。那就是,它固定只能處理最多5000個學員的成績。假想,這個軟件要推廣到全市300個學校,每個學校的學生總數都是不一樣的,更慘的是每一年,一個學校的學生個數總是會有變化。難道就讓我們的王老師時不時地改它的程序?
<P>在沒有指針時,惟一辦法就是,浪費一點,比如定義數組元素個數為1萬。目的是寧可浪費一點,也盡量不要出現不夠的情況。顯然,本辦法只能算是一個無奈之舉。難道就沒有一個辦法,即可以適應某個山區小學只有30名學員也情況,又可以輕松對付某大學高達2萬名學員的情況?
<P>
<P>鑼聲響起,鏘鏘鏘……指針出場了。
<P>
<P>指針是如何完成這一歷史使命?帶著問題,我們來學習下面的內容。
<P>我們會在學習新內容之中,同時有選擇地做一些舊知識點的復習工作。但如果你仍看不懂下面的一些代碼,那得全面復習前兩章的指針內容;或者,如果你連<SPAN
lang=en-us>for</SPAN>都有些陌生,那你得重溫一下小王成績管理系統的前兩個版本。
<P>
<H3><A name=21.3><B>21</B>.3</A> 指針的最常用用法</H3>
<H4><A name=21.3.1>21.3.1</A><SPAN lang=en-us> </SPAN>分配內存</H4>
<P>如何為指針分配和釋放內存,上一章的內容中講到了C++獨用的<SPAN lang=en-us>new/delete</SPAN>、<SPAN
lang=en-us>new[] / delete[] </SPAN>和<SPAN lang=en-us> </SPAN>C 使用的<SPAN
lang=en-us>malloc, realloc/ free</SPAN> 方法。如果你忘了,請先復習。我們這里使用<SPAN
lang=en-us>C++</SPAN>的方法演練。
<P>
<P><SPAN lang=en-us>new </SPAN>只能為我們分配一個簡單變量的內存,就是說<SPAN
lang=en-us>new</SPAN>只蓋了一間房子。<SPAN lang=en-us>new [] </SPAN>才能為我們蓋出一排的房子。
<P>
<P>例子:
<P><SPAN lang=en-us>int* p; //</SPAN>定義一個整型指針
<P>
<P><SPAN lang=en-us>p = new [10]; //new [] </SPAN>為我們分配出10個<SPAN
lang=en-us>int</SPAN>大小的內存。(蓋了10間房,每間住一個整數<SPAN lang=en-us>)</SPAN>
<P>
<H4><A name=21.3.2>21.3.2</A> 訪問指針指向的內存</H4>
<P>前面:<SPAN lang=en-us>p = new [10]</SPAN>; 為我們分配了10個<SPAN
lang=en-us>int</SPAN>,那么,我們該如何設置和訪問這10個整數的值呢?
<P>這一點完全和數組一致,我們來看數組是如何操作:
<P>
<P><B><FONT color=#008000><SPAN lang=en-us>int a[10];
//</SPAN>以數組方式來定義10個<SPAN lang=en-us>int</SPAN></FONT></B>
<P>
<P><B><FONT color=#008000><SPAN
lang=en-us>//</SPAN>讓第1個整數的值為100:</FONT></B>
<P><B><FONT color=#008000><SPAN lang=en-us>a[0] = 100;</SPAN></FONT></B>
<P><B><FONT color=#008000><SPAN lang=en-us>//</SPAN>讓第<SPAN
lang=en-us>2</SPAN>個整數的值為<SPAN lang=en-us>80</SPAN>:</FONT></B>
<P><B><FONT color=#008000><SPAN lang=en-us>a[1] =</SPAN> <SPAN
lang=en-us>80;</SPAN></FONT></B>
<P>
<P>指針的操作方式如下:
<P>
<P><B><FONT color=#ff00ff><SPAN lang=en-us>int* p = new int[10];
//</SPAN>定義1個整型指針,并為它分配出10個<SPAN lang=en-us>int</SPAN>的空間</FONT></B>
<P>
<P><B><FONT color=#ff00ff><SPAN
lang=en-us>//</SPAN>讓第1個整數的值為100:</FONT></B>
<P><B><FONT color=#ff00ff><SPAN lang=en-us>p[0] = 100;</SPAN></FONT></B>
<P><B><FONT color=#ff00ff><SPAN lang=en-us>//</SPAN>讓第<SPAN
lang=en-us>2</SPAN>個整數的值為<SPAN lang=en-us>80</SPAN>:</FONT></B>
<P><B><FONT color=#ff00ff><SPAN lang=en-us>p[1] =</SPAN> <SPAN
lang=en-us>80;</SPAN></FONT></B>
<P>
<P>對比以上兩段代碼,你可以發現,對指針分配出的元素操作,完全和對數組的元素操作一致。不過,指針還有另一種對其元素的操作方法:
<P>
<P><B><SPAN lang=en-us>int* p = new int[10];
//</SPAN>定義1個整型指針,并為它分配出10個<SPAN lang=en-us>int</SPAN>的空間</B>
<P>
<P><B><SPAN lang=en-us>//</SPAN>讓第1個整數的值為100:</B>
<P><B><FONT color=#ff0000>*(<SPAN lang=en-us>p</SPAN>+0)</FONT><SPAN
lang=en-us> = 100;</SPAN></B>
<P><B><SPAN lang=en-us>//</SPAN>讓第<SPAN lang=en-us>2</SPAN>個整數的值為<SPAN
lang=en-us>80</SPAN>:</B>
<P><B><FONT color=#ff0000>*(<SPAN lang=en-us>p</SPAN>+<SPAN
lang=en-us>1</SPAN>)</FONT> = 80;</B>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -