📄 c72.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>定义和初始化 </title>
<script language="javascript">
var prePage="c/c7/c71.htm";
var nextPage="c/c7/c73.htm";
function showwin(url,winname,properties){
window.open(url,winname,properties)
}
</script>
<link rel="stylesheet" href="../cstyle.css" type="text/css">
<bgsound src="../voice/c72.au" loop="1">
</head>
<body background="../img/mainback.jpg" bgproperties="fixed">
<h2 align="center"><font face="楷体_GB2312"><a name="_top"></a>7.2 定义和初始化</font>
</h2>
<table border="0" width="100%">
<tr>
<td width="16%" align="center"><a href="c72.htm#c721.html#c721">字符串常量</a></td>
<td width="16%" align="center"><a href="c72.htm#c722.html#c722">字符串</a></td>
<td width="17%" align="center"><a href="c72.htm#c723.html#c723">字符串指针</a></td>
<td width="17%" align="center"><a href="c72.htm#c724.html#c724">字符串数组</a></td>
<td width="17%" align="center"><a href="c72.htm#c725.html#c725">指针和字符串</a></td>
<td width="17%" align="center"><a href="c72.htm#c726.html#c726">练习题</a></td>
</tr>
</table>
<hr>
<h3><a name="c721"></a>1.字符串常量</h3>
<blockquote>
<p>有许多方法可以用来<font color="#FF0000">定义一个串</font>。我们将看到几种最重要的方法:<br>
*使用串常量;<br>
*使用字符串数组;<br>
*使用字符指针;<br>
*使用包含字符串的数组。<br>
<br>
因为字符串实际上是数组,故受到与数组一样的限制。此外,
字符串还有两条限制。数组名不是变量,
不能作为赋值运算的左操作数。<br>
<br>
每当编译器遇到包含在<font color="#FF0000">双引号</font>中的东西,
它就认为是<font color="#FF0000">字符串常量</font>。其中的字符再加上一个
'\0' 字符, 被存入相邻的存储单元中。计算机可以算出字符的个数,
这样就可以知道需要多少内存。<br>
<br>
使用<font color="#FF0000">字符串常量</font>的方法很多。其中最常用的是作为参数传递给
printf() 函数和 puts() 函数。下边是一些例子。<br>
<br>
printf("Hello!");<br>
puts("Good morning");<br>
printf("%s\n","C is a good language");<br>
#define MSG "You must tell me something"<br>
<br>
如果你想在一个串中使用一个<font color="#FF0000">双引号</font>,
必须在它前面加一个<font color="#FF0000">反斜杠 \ </font>;<br>
printf(":<font color="#FF0000">\"</font>Run, spot, run!<font color="#FF0000">\"</font>
said Dick.\n");<br>
这样就产生了下面的输出: <font color="#008080"><strong>"Run, spot,
run!" said Dick.</strong></font><br>
</p>
<p class="note">注意: 字符串常量的存贮类型是 static。整个串作为一个指向其存贮位置的<font
color="#FF0000">指针</font>。这类似于数组名指向数组的起始地址。</p>
<p align="left">main()<br>
{<br>
printf("%s, %u,
%c\n","we","love",*\"figs\");</p>
<p align="left">}<br>
<br>
使用 %s 格式打印一个串, 可以产生输出 we 。用 %u
格式可以输出无符号整数。如果短语 "love" 是一个指针类型,
那么这将会输出 "love"` 指针的值,
也就是字符串中第一个字符所在的地址。*"figs" 产生地址值,
即字符串 "figs" 的第一个字符的地址。<br>
<br>
输出 <br>
we,34,f</p>
<p align="right"><a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<h3><a name="c722"></a>2.字符串</h3>
<blockquote>
<p>当我们定义了一个<font color="#FF0000">字符串数组</font>时,
我们必须让编译器知道它需要多少空间。达到这个目的的一个办法是用字符串常量初始化这个数组。请看例子。<br>
<br>
char m1[] = "Hello";<br>
static char m2[] = "Good";<br>
func1()<br>
{<br>
char m3[] = "OK";<br>
}<br>
<br>
正如其它的数组一样,
数组名是一个指向数组中第一个元素的指针。即<br>
m1 == &m1[0], *m1 == 'H', *(m1+1) == m1[1] =='e'; <br>
<br>
<img src="../img/c721.jpg" alt="c721.jpg (4690 bytes)" align="right" WIDTH="312"
HEIGHT="64">另一种建立存贮空间的方法是<font color="#FF0000">直接说明</font>。在外部说明中,
我们可以用:<br>
char m1[8] = "Hello"; 来取代 char m1[] = "Hello";<br>
<br>
要注意的是元素的个数至少应比串长多一个 (这就是<font color="#FF0000">空字符</font>)
。象其它数组一样, 任何没有引用的元素被自动地初始化为 \0 (用字符型表示就是<font
color="#FF0000">空字符</font>, 而不是字符 0)。<br>
<br>
</p>
<p align="right"><a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<h3><a name="c723"></a>3.字符串指针</h3>
<blockquote>
<p>我们也可以用指针方式来建立一个字符串。例如 <font color="#FF0000">char
*m1 = "Hello"</font>; 这与 <font color="#FF0000">char m1[] = "Hello"</font>
几乎是一样的。以上两种说明方法都说明了 <font color="#FF0000">m1</font>
是一个指向字符串 "Hello" 的<font color="#FF0000">指针</font>。
在两种情况下, 串本身都决定了自身所需空间的大小。<br>
但这两种形式是不同的, 仔细想想, <a
href="javascript:showwin('c72_1.htm','比较','toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0,copyhistory=0,width=532,height=400')">差别是什么</a>?
<img src="../img/lefthand.gif" alt="lefthand.jpg (983 bytes)" WIDTH="45" HEIGHT="20"></p>
<p>让我们给出一些例子来解释数组和指针之间的差别。<br>
char heart[] = "Hello";<br>
char *head = "Hello";<br>
<br>
其中主要的差别就是指针 heart 是一个<font color="#FF0000">常量</font>,
而指针 head 是一个<font color="#FF0000">变量</font>。<br>
<br>
让我们看看, 这在实际应用中造成的差别。首先,
两者均作为指针来用, 都可以进行加法运算。<br>
<br>
for (i=0; i<3; i++)<br>
putchar(*(heart+i));<br>
putchar('\n');<br>
for (i=0; i<3; i++)<br>
putchar(*(head+i));<br>
putchar('\n');<br>
<br>
输出结果都为 <font color="#008080"><strong><big>Hel</big></strong></font><br>
<br>
指针能够作为<font color="#FF0000">自增</font>的操作数来使用。下面的语句是正确的:<br>
While (*(head) != '\0')<br>
putchar(*(head++));<br>
<br>
假设我们想让 head 和 heart 保持一致, 那么可以如下做: <br>
head = heart; /* head now points to the array heart */<br>
<br>
而这样是不行的: heart = head; /*illegal construction */ <br>
<br>
这种情形和 x=3; 和 3=x; 相仿, 赋值语句左部是变量名。附带的, head =
heart; 不会使 Hello 这个串消失, 它只是改变了 head 中的地址。<br>
<br>
要改变 heart 的内容, 可以采用改变数组内容的办法来进行。<br>
heart[3] = 'M'; 或 *(heart+3) = 'M';</p>
<p class="note">虽然数组的元素是变量, 但是数组名不是变量。</p>
<p align="right"><a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<h3><a name="c724"></a>4.字符串数组</h3>
<blockquote>
<p>通常使用一个含字符串的数组是很方便的。这样可以通过下标来访问几个不同的串。看下边的例子。<br>
<font color="#000080"><strong>static char *fruit[3] ={"Apple", "Pear",
"Orange"};</strong></font><br>
仔细看一下就明白, fruit
是一个具有三个指向字符串的指针的数组。不难看出,
它包含着三个指向数组下标的指针。<br>
<br>
第一个指针是 fruit[0],它指向第一个串; 第二个指针是 fruit[1],它指向第二个串,
以此类推。</p>
<p class="note">在此特别要指出的是,
每个指针分别指向各个字符串的第一个字符:<br>
*fruit[0] == 'A'; *fruit[1] == 'P'; *fruit[2] == 'O';</p>
<p>它的初始化遵循数组初始化的原则。大括号中的部分和以下形式是等价的。<br>
{{'A','p','p','l','e','\0'};{'P','e','a','r','\0'}; {'O','r','a','n','g','e','\0'}};<br>
<br>
另外,
我们用类似于下例的说明方法来显示一个字符串数组的长度的说明。<br>
<font color="#000080"><strong>static char fruit[3][7] ={"Apple",
"Pear", "Orange"};</strong></font><br>
<br>
它和前面的例子有什么差别吗? <br>
<br>
两条语句的区别如下。<br>
第二种方法产生了一个 "矩阵" 数组,
数组的每一行长度相同。<br>
但是第一种方法产生了一个 "参差不齐"
的数组。数组的每行的长度是 "非定长" 的,
长度取决于初始化时的情况。</p>
<p align="right"><a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<h3><a name="c725"></a>5.指针和字符串</h3>
<blockquote>
<p align="left">在关于字符串的说明中, 经常要引用到指针。在 C 语言中,
大多数的字符串操作都是通过指针来进行的。 <a
href="javascript:showwin('c72_5.htm',null,'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0,copyhistory=0,width=600,height=600')">请看例子</a><img
src="../img/lefthand.gif" alt="lefthand.jpg (983 bytes)" WIDTH="45" HEIGHT="20">
尽管它没有实际意义, 但富有启发性。</p>
<p align="right"><br>
<a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<hr>
<h3><a name="c726"></a>6.练习题</h3>
<blockquote>
<p><a
href="javascript:showwin('c72_ex.htm','练习题','toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0,copyhistory=0,width=600,height=600')">让我们来看一个程序:</a><img
src="../img/lefthand.gif" alt="lefthand.jpg (983 bytes)" WIDTH="45" HEIGHT="20"></p>
<p align="right"><a href="c72.htm#_top.html#_top">返回页首</a></p>
</blockquote>
<p align="center"><a href="http://www.nec.sjtu.edu.cn/support/Course/C/c/c7/c73.htm"><img src="../img/next.gif" width="145" height="30"
alt="next.gif (3633 bytes)" border="0"></a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -