📄 教学--第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 + -