⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第20章 指针二 为指针分配和释放空间.htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0049)http://www.d2school.com/bcyl/bhcpp/newls/ls20.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.2769" 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: &Euml;&Icirc;&Igrave;&aring;" 
    width="100%" height=210>
      <H2>第二十章 指针 二 <SPAN lang=zh-cn>为指针分配和释放空间</SPAN></H2>
      <P>  
      <P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.1">20.1 
      理解指针的两种“改变”</A> 
      <P><A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.1.1">&nbsp; 
      20.1.1 改变指针的值</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.1.2">20.1.2 
      改变指针所指的变量的值</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.1.3">20.1.3 
      两种改变?一种改变?</A> 
      <P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2">20.2 
      C++ 方式的内存分配与释放 new 和 delete</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2.1">20.2.1 new 
      </A>
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2.2">20.2.2 
      在new 时初始化内存的值</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2.3">20.2.3 
      delete</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2.4">20.2.4 实验: 
      new 和 delete</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.2.5">20.2.5 new 
      和 delete 的关系</A> 
      <P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.3">20.3 
      new [] 和 delete []</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.3.1">20.3.1 
      new[] / delete[] 基本用法</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.3.2">20.3.2 new 
      []/ delete[] 示例</A> 
      <P>&nbsp;<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.3.3"> 20.3.3 
      详解指向连续空间的指针</A> 
      <P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.4">20.4 
      delete/delete[] 的两个注意点</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.4.1">20.4.1 
      一个指针被删除时,应指向最初的地址</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.4.2">20.4.2 
      已释放的空间,不可重复释放</A> 
      <P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.5">20.5 C 
      方式的内存管理</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.5.1">20.5.1 
      分配内存 malloc 函数</A> 
      <P>&nbsp;<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.5.2"> 20.5.2 
      释放内存 free 函数</A> 
      <P>&nbsp; <A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.5.3">20.5.3 
      重调空间的大小: realloc 函数</A> 
      <P>&nbsp;<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls20.htm#20.5.4"> 20.5.4 
      malloc、realloc、free的例子</A> 
      <P>
      <P>  
      <H3><B><A name=20.1>20.1</A> 理解指针的两种“改变”</B></H3>
      <P>普通变量(非指针,简单类型变量)只能改变值: 
      <P>  
      <P><SPAN lang=en-us>1) int a = 100;</SPAN> 
      <P><SPAN lang=en-us>2) ...</SPAN> 
      <P><SPAN lang=en-us>3) a = 200;</SPAN> 
      <P>  
      <P>第<SPAN lang=en-us> </SPAN>1<SPAN lang=en-us> 
      </SPAN>行代码,声明int类型变量a,并且初始化a的值为100。 
      <P>到第<SPAN lang=en-us> </SPAN>3<SPAN lang=en-us> </SPAN>行代码,变量a的值被改变成200。 
      <P>  
      <P>对于非指针的简单变量,能被程序改变的,只有这一种。而指针变量,似乎有两种改变。 
      <P>  
      <H4><A name=20.1.1>20.1.1</A> 改变指针的值</H4>
      <P>这一点和普通变量一致。但要特别注意,“改变指针的值”引起的结果是什么?其实就是“改变指针的指向”。 
      <P>因为,指针的值是某个变量的地址。假如指针P原来的值是A变量的地址,现在改为B变量的地址。我们称为:“P由指向A改为指向B”。这就是指针的第一种改变。 

      <P>以下是示例代码: 
      <P><SPAN lang=en-us>int* P;</SPAN> 
      <P><SPAN lang=en-us>int A,B;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>1) P = &amp;A;</SPAN> 
      <P><SPAN lang=en-us>2) ...</SPAN> 
      <P><SPAN lang=en-us>3) P = &amp;B;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>1) </SPAN>行代码中,P 的值为<SPAN lang=en-us> 
      &amp;A</SPAN>,即P指向变量A。 
      <P>到3)行代码中,<SPAN lang=en-us>P</SPAN>的值变为<SPAN 
      lang=en-us>&amp;B</SPAN>,即改为指向变量B。 
      <P>  
      <P>下面讲:指针的第二种改变<SPAN lang=zh-cn>。</SPAN>通过指针,改变指针所指的变量的值。 
      <P>  
      <H4><A name=20.1.2>20.1.2</A> 改变指针所指的变量的值</H4>
      <P>  
      <P>复习前一章,我们知道通过 * (地址解析符),可以得到、或改变指针所指的变量的值。 
      <P>  
      <P><SPAN lang=en-us>int* P;</SPAN> 
      <P><SPAN lang=en-us>int A = 100;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>P = &amp;A;</SPAN> 
      <P><B><SPAN lang=en-us>*P = 200;</SPAN></B> 
      <P>  
      <P><SPAN lang=en-us>cout &lt;&lt; A &lt;&lt; endl;</SPAN> 
      <P>  
      <P>代码中加粗的那一行:<SPAN lang=en-us>*P = 200; </SPAN>,其作用完全等同于:<SPAN 
      lang=en-us>A = 200;</SPAN> 
      <P>所以,最后一行输出的结果是 200。 
      <P>  
      <P>这就是指针的第二种改变:所指变量的值,被改变了。 
      <P>  
      <H4><A name=20.1.3>20.1.3</A> <SPAN lang=zh-cn>两种改变?一种改变?</SPAN></H4>
      <P>  
      <P>两种改变的意义不同: 
      <P>改变一:改变指针本身的值(改变指向)。 
      <P>改变二:改变指针指向的变量的值。 
      <P>  
      <P>从代码上看: 
      <P>第一种改变,P = <SPAN lang=en-us>&amp;A; </SPAN>左值(等号左边的值)是变量本身,右值则是一个地址。 
      <P>而第二种改变,<SPAN lang=en-us>*P = </SPAN>200<SPAN lang=en-us>; 
      </SPAN>左值通过星号对P操作,来取得P指向的变量;右值是普通的值。 
      <P>  
      <P>理解<SPAN lang=en-us>,</SPAN>区分对指针的两种改变,才能学会如何使用指针。 
      <P>  
      <P>请思考:上一章讲的“指针的加减操作”,是对指针的哪一种改变? 
      <P>  
      <P>最后需要说明,严格意义上,指针仍然只有一种改变,即改变指针本身的值。改变指针指向的变量,应视为对另一变量的改变,只不过在代码上,它通过指针来进行,而不是直接对另一变量进行操作。 

      <P>  
      <P>为指针分配、释放内存空间 
      <P>  
      <P>之前,我们给指针下的定义是“指针是一个变量,它存放的值是另一个变量的地址”。 
      <P>比如: 
      <P><SPAN lang=en-us>int a;</SPAN> 
      <P><SPAN lang=en-us>int* p = &amp;a;</SPAN> 
      <P>  
      <P>看,a 就是“另一个变量”,p指向了a。 
      <P>我们知道,变量总是要占用一定的内存空间,比如上面的a,就占用了4个字节(<SPAN 
      lang=en-us>sizeof(int))</SPAN>。这四个字节属于谁?当然属于变量a,而不是p。 
      <P>  
      <P>现在要讲的是:也可以单独为指针分配一段新的内存空间。这一段内容不属于某个变量。 
      <P>  
      <H3><SPAN lang=zh-cn><A name=20.2>20.2</A> </SPAN><SPAN lang=en-us>C++ 
      </SPAN>方式的内存分配与释放<SPAN lang=en-us> new </SPAN>和<SPAN lang=en-us> 
      delete</SPAN></H3>
      <P><SPAN lang=zh-cn>在内存管理上,C++ 和 C 
      有着完全不同的两套方案。当然,C++的总是同时兼容C。C的那一套方案在C++里同样可行。</SPAN> 
      <P><SPAN lang=zh-cn>我们首先看看纯C++的那一套:</SPAN> new <SPAN lang=zh-cn>和</SPAN> 
      delete<SPAN lang=zh-cn>。</SPAN> 
      <P>new <SPAN lang=zh-cn>,从字面上看意思为 “新”;而</SPAN>delete <SPAN 
      lang=zh-cn>字面意思为“删除”。二者在C++中内存管理中大致的功能,应是一个为“新建”,一个为“删除”。</SPAN> 
      <P>  
      <H4><B><SPAN lang=zh-cn><A name=20.2.1>20.2.1</A> </SPAN><SPAN 
      lang=en-us>new </SPAN></B></H4>
      <P>  
      <P><SPAN lang=en-us>new </SPAN>是<SPAN lang=en-us> c++ 
      </SPAN>的一个关键字。被当作像<SPAN lang=en-us> +</SPAN>、-、* 、/ 
      一样的操作符。它的操作结果是在申请到一段指定数据类型大小的内存。 
      <P>  
      <P>语法: 
      <P>  
      <P>指针变量<SPAN lang=en-us> = <B>new</B> </SPAN>数据类型<SPAN lang=en-us>;</SPAN> 

      <P>  
      <P><SPAN lang=en-us>new </SPAN>将做三件事: 
      <P>  
      <P>1、主动计算指定数据类型需要的内存空间大小; 
      <P>2、返回正确的指针类型; 
      <P>3、在分配内存的一,将按照语法规则,初始化所分配的内存。 
      <P>  
      <P>这是什么意思呢?看看例子吧: 
      <P>  
      <P><SPAN lang=en-us>int* p;</SPAN> 
      <P><SPAN lang=en-us>p = new int;</SPAN> 
      <P>  
      <P>和以往不一样,p 这回不再“寄人篱下”,并不是指向某个已存在的变量,而是直接指向一段由<SPAN lang=en-us>new 
      </SPAN>分配而来的新内存空间。 
      <P>  
      <P>“<SPAN lang=en-us>p </SPAN>指向一段由<SPAN lang=en-us>new </SPAN>分配而来的新内存空间” 
      这句话等同于: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -