5.14 章节小结
指针变量的值为内存地址。
下列声明: int *ptr
声明变量 ptr
为 int
类型对象的指针,或者说成 ptr 是 int 的指针。声明为指针的每个变量前面都要加上星号(*)。
指针可以初始化为 0、NULL 或一个地址。数值为 0 或 NULL 的指针不指任何内容。
数值0是可以直接赋给指针变量的惟一整数值。
&
(地址)运算符返回操作数的地址。
地址运算符的操作数必须是变量名,地址运算符不能用于常量、不产生引用的表达式和用存储类register声明的变量。
*运算符通常称为间接运算符或复引用运算符。返回操作数(即指针)所指对象的同义词、别名或浑名。这种使用*的方法称为复引用指针。
调用函数并要修改参数时,传递该参数地址。被调用函数使用间接运算符(*)修改调用函数中的参数值。
接收地址参数的函数要定义接收地址的指针参数。
不需要在函数原型中包括指针名,只要包括指针类型即可。参数名仅用于程序中的说明,编译器将其忽略。
const 限定符使程序员通知编译器,特定变量的值不能修改。
如果试图修改 const 类型的值,则编译器会捕获这个错误并发出一个警告或错误消息(取决于特定的编译器)。
将指针传递给函数有四种方法:非常量数据的非常量指针、非常量数据的常量指针、非常量数据的常量指针和常量数据的常量指针。
数组自动用指针按引用传递,因为数组名的值为数组地址。
要用指针按引用调用传递单个数组元素,就必须传递特定数组元素的地址。
C++ 提供一元运算符 sizeof
,确定程序执行期间的数组长度或其他数据类型长度(字节数)。
采用数组名时, sizeof
运算符返回数组中的总字节数为 size_t
类型的值,通常是 unsigned int 类型。
sizeof运算符可以用于任何变量名、类型名或常量值。
指针可以使用自增(++)或自减(--)运算符,整数可以加进指针中(+或+=),也可以从指针中减去整数(-或-=),指针可以减去另一指针。
将指针增加或减去一个整数时,指针并不是直接增加或减去这个整数,而是加上指针所指对象长度的这个倍数。
对相邻内存地址(如数组)进行指针算法时才有意义。数组中的所有元素在内存中是相邻存放的。
对字符数组进行指针算法时,结果与普通算法相同,因为每个字符占一个字节内存。
如果两个指针的类型相同,则可以将一个指针赋绐另一个指针。否则要用强制类型转换运算符将赋值浯句右边的指针值转换为赋值语句左边的指针值。这个规则的例外是void 的指针(即 void*
),该指针是个一般性指针,可以表示任何指针类型。所有指针类型都可以赋给 void
指针而不需要进行强制类型转换。但是, void
指针不能直接赋给另一类型的指针,而要先将 void
指针转换为正确的指针类型。
void*
指针不能复引用。
指针可以用相等和关系运算符比较,但这种比较只在对相同数组成员进行时才有意义。
指针也可以像数组一样带有下标。
数组名等同于数组第一个元素的指针。
指针/偏移量符号中的偏移量等同于数组下标。
所有带下标的数组表达式都可以写成指针和偏移量,或是用数组名作为指针,或是用一个独立的指针指向数组。
数组名实际上是个常量指针,总是指向数组开头的内存地址。
数组可以包含指针。
函数指针包含函数在内存中的地址。
函数指针可以传入函数、从函数返回、存放在数组中和赋给其他的函数指针。
函数指针的一个用法是建立菜单驱动系统,提示用户从菜单选择一个选项。
函数 strcpy
将第二个参数(字符串)复制到第一个参数(字符数组)中,这个字符数组的长度应当足以放下字符串及其 null
终止符。
函数 stmcpy
与 strepy
相似,只是 stmcpy
指定从字符串复制到字符数组的字符数。注意函数 strncpy
不一定复制第二个参数的 null
终止符, null
终止符要在复制的字符数比字符串长度至少多1时才复制。
函数strcat将第二个参数(字符串)添加到第一个参数(字符数组)中。第二个参数的第一个字符代替终止第一个参数中字符串的 null
终止符( '\0'
)。程序员要保证存放第一个字符串的数组应足以存放第一个字符串和第二个字符串。
函数 strncat
从第二个字符串添加指定字符数到第一个字符串中,并在结果中添加 null
终止符。
函数 strcmp
一次一个字符地比较第一个字符串参数与第二十字符串参数。如果字符串相等,则函数返回0,如果第一个字符串小于第二个字符串,则函数返回负值;如果第一个字符串大于第二个字符串,则函数返回正值。