博文
第6章 指针6.1 指针的概念(2008-09-29 17:31:00)
摘要:
为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。
如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。例如,C++编译系统一般为整型变量分配4个字节,为单精度浮点型变量分配4个字节,为字符型变量分配1个字节。内存区的每一个字节有一个编号,这图6.1就是“地址”。
请务必弄清楚一个内存单元的地址与内存单元的内容这两个概念的区别。在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为直接存取方式,或直接访问方式。
还可以采用另一种称为间接存取(间接访问)的方式。可以在程序中定义这样一种特殊的变量,它是专门用来存放地址的。
图6.2是直接访问和间接访问的示意图。为了将数值3送到变量中,可以有两种方法:
(1) 直接将数3送到整型变量i所标识的单元中。见图6.2(a)。
(2) 将3送到指针变量i_pointer所指向的单元(这就是变量i所标识的单元)中。见图6.2(b)。
所谓指向,就是通过地址来体现的。
由于通过地址能找到所需的变量单元,因此可以说,地址指向该变量单元。因此将地址形象化地称为“指针”。一个变量的地址称为该变量的指针。
如果有一个变量是专门用来存放另一变量地址(即指针)的,则它称为指针变量。指针变量的值(即指针变量中存放的值)是地址(即指针)。
......
C++ 入门第5章5.6.4 字符串运算举例(2008-09-28 10:27:00)
摘要:
例5.11 输入3个字符串,要求将字母按由小到大的顺序输出。
#include <iostream>
#include <string>
using namespace std;
int main( )
{string string1,string2,string3,temp;
cout<<″please input three strings:″; //这是对用户输入的提示
cin>>string1>>string2>>string3; //输入3个字符串
if(string2>string3) {temp=string2;string2=string3;string3=temp;}
//使串2≤串3
if(string1<=string2) cout<<string1<<″ ″<<string2<<″ ″<<string3<<endl;
//如果串1≤串2,则串1≤串2≤串3
else if(string1<=string3) cout<<string2<<″ ″<<string1<<″ ″<<string3<<endl;
//如果串1>串2,且串1≤串3,则串2<串1≤串3
else cout<<string2<<″ ″<<string3<<″ ″<<string1<<endl;
//如果串1>串2,且串1>串3,则串2<串3<串1
}
运行情况如下:
please input three strings: China&nbs......
C++ 入门5.6.3 字符串数组(2008-09-28 10:25:00)
摘要:
不仅可以用string定义字符串变量,也可以用string定义字符串数组。如
string name[5]; //定义一个字符串数组,它包含5个字符串元素
string name[5]={″Zhang″,″Li″,″Fun″,″Wang″,″Tan″};
//定义一个字符串数组并初始化
此时name数组的状况如图5.11所示。
可以看到:
(1) 在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量。
(2) 并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。
(3) 在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。
(4) 每一个字符串元素中只包含字符串本身的字符而不包括′\0′。
可见用字符串数组存放字符串以及对字符串进行处理是很方便的。
在定义字符串数组时怎样给数组分配存储空间呢?实际上,编译系统为每一个字符串变量分配4个字节,在这个存储单元中,并不是直接存放字符串本身,而是存放字符串的地址。在本例中,就是把字符串″Zhang″的地址存放在name[0],把字符串″Li″ 的地址存放在name[1],把字符串″Fun″的地址存放在name[2]……图5.11只是一个示意图。在字符串变量中存放的是字符串的指针(字符串的地址)。
......
C++ 入门第5章5.6.2 字符串变量的运算(2008-09-28 10:24:00)
摘要:
在上一节中可以看到: 在以字符数组存放字符串时,字符串的运算要用字符串函数,如strcat(连接)、strcmp(比较)、strcpy(复制),而对string类对象,可以不用这些函数,而直接用简单的运算符。
(1) 字符串复制用赋值号
string1=string2;
其作用与“strcpy(string1,string2);”相同。
(2) 字符串连接用加号
string string1=″C++″; //定义string1并赋初值
string string2=″Language″; //定义string2并赋初值
string1=string1 + string2; //连接string1和string2
连接后string1为″C++ Language″。
(3) 字符串比较直接用关系运算符
可以直接用 ==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。
使用这些运算符比使用5.5.5节中介绍的字符串函数直观而方便。
......
C++ 入门第5章5.6.1 字符串变量的定义和引用(2008-09-28 10:22:00)
摘要:
1. 定义字符串变量
和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名string。如
string string1; //定义string1为字符串变量
string string2=″China″; //定义string2同时对其初始化
应当注意: 要使用string类的功能时,必须在本文件的开头将C++标准库中的string头文件包含进来,即应加上
#include <string> //注意头文件名不是string.h
2. 对字符串变量的赋值
在定义了字符串变量后,可以用赋值语句对它赋予一个字符串常量,如
string1=″Canada″;
既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。如
string2=string1; //假设string2和string1均已定义为字符串变量
不要求string2和string1长度相同,假如string2原来是″China″,string1原来是″Canada″,赋值后string2也变成″Canada″。在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。
可以对字符串变量中某一字符进行操作,如
string word=″Then″;  ......
C++ 入门第5章5.5.5.6 字符数组应用举例(2008-09-27 13:17:00)
摘要:
例5.10 有3个字符串,要求找出其中最大者。要求用函数调用。
程序如下:
#include <iostream>
#include <string>
using namespace std;
int main( )
{ void max_string(char str[][30],int i); //函数声明
int i;
char country_name[3][30];
for(i=0;i<3;i++)
cin>>country_name[i]; //输入3个国家名
max_string(country_name,3); //调用max_string函数
return 0;
}
void max_string(char str[][30],int n)
{
int i;
char string[30];
strcpy(string,str[0]); //使string的值为str[0]的值
for(i=0;i<n;i++)
&nbs......
C++ 入门第5章5.5.5.4. 字符串长度函数strlen(2008-09-27 13:16:00)
摘要:
函数原型为
strlen(const char[]);
strlen是string length(字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括′\0′在内。如
char str[10]=″China″;
cout<<strlen(str);
输出结果不是10,也不是6,而是5。
以上是几种常用的字符串处理函数,除此之外还有其他一些函数。
......
C++ 入门第5章5.5.5.3字符串比较函数strcmp(2008-09-27 13:16:00)
摘要:
其函数原型为
strcmp(const char[],const char[]);
strcmp是string compare(字符串比较)的缩写。作用是比较两个字符串。由于这两个字符数组只参加比较而不应改变其内容,因此两个参数都加上const声明。以下写法是合法的:
strcmp(str1,str2);
strcmp(″China″,″Korea″);
strcmp(str1,″Beijing″);
比较的结果由函数值带回。
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为一正整数。
(3) 如果字符串1<字符串2,函数值为一负整数。
字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到′\0′为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
注意:对两个字符串比较,不能用以下形式:
if(str1>str2) cout<<″yes″;
字符数组名str1和str2代表数组地址,上面写法表示将两个数组地址进行比较,而不是对数组中的字符串进行比较。对两个字符串比较应该用
if(strcmp(str1,str2)>0) cout<<″yes″;
......
C++ 入门第5章5.5.5.2字符串复制函数strcpy(2008-09-27 13:15:00)
摘要:
其函数原型为
strcpy(char[],const char[]);
strcpy是string copy(字符串复制)的缩写。它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖。例如
char str1[10],str2[]=″China″;
strcpy(str1,str2);
执行后,str2中的5个字符″China″和′\0′(共6个字符)复制到数组str1中。
说明:
(1) 在调用strcpy函数时,第一个参数必须是数组名(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量。
(2) 可以用strcpy函数将一个字符串中前若干个字符复制到字符数组中去。
(3) 只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
......
C++ 入门第5章5.5.5.1字符串连接函数strcat(2008-09-27 13:14:00)
摘要:
其函数原型为
strcat(char[],const char[]);
strcat是string catenate(字符串连接)的缩写。该函数有两个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。第二个字符数组被指定为const,以保证该数组中的内容不会在函数调用期间修改。连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。例如
char str1[30]=″People′s Republic of ″;
char str2[]=″China″;
cout<<strcat(str1,str2)); //调用strcat函数
输出:
People′s Republic of China
连接前后的状况如图5.10所示。
......