指针
小结1
指针类型是C语言中一种特殊的数据类型,指针变量中存放的是另一个变量的地址。
1. 指针变量的定义
(1)一般定义形式
类型说明符 * 指针变量标识符;
其中,类型说明符代表了指针变量所指向的目标变量的数据类型,可以是C语言中各种基本数据类型及结构类型。
注意 说明
*说明所定义的是指针变量,应与乘法运算符和取内容运算符相区别。
在定义指针的同时可对其初始化,初始化的值只能是已定义变量的地址。
(2)二级指针的定义
类型说明符 ** 指针变量标识符;
指针型指针又称为指向指针的指针(或多级指针),指针型指针指向的也是一个指针,对指针型指针所指向的目标变量的访问是多重间接访问。(详见本章的“知识补充与扩展”内容)
(3)指针型数组的定义
类型说明符 * 指针数组名(整型常量表达式);
2. 指针变量的运算
指针运算的实质是地址运算,指针可以进行4种运算。
(1)取地址运算和取内容运算
- 取地址运算:一般用于对指针变量赋值,使指针指向确定数据的存储单元。指针变量必须先赋值再使用。
- 取内容运算:一般形式为
*指针变量名,引用指针所指向的目标变量;取地址和取内容互为逆运算。
(2)指针与整数n的加减运算
指针与整数n的加减运算的实质是用于调整指针所指向的对象,即从指针当前位置向前或向后移动n个数据项。指针移动的实际地址与数据项所占的存储长度有关,其一般形式为:
p + n * sizeof(数据类型)
(3)指针相减的运算
指针相减的运算用于求指向同一数据对象的两个指针间数据项的个数。
(4)指针的比较运算
>、<:用于比较两个同型指针的地址值的大小。==、!=:用于判断两个指针是否指向同一数据。
3. 指针与数组
指针与数组有密切的关系,数组名是指向数组起始地址的指针常量,当将数组名 a 赋予指针变量 p 时,即将指针 p 指向数组的起始地址,则 *(p+i) 与 a[i] 等效。因此使用指针法访问数组元素与使用下标法一样方便,但使用指针更加高效灵活,尤其是使用指针及其运算处理字符串数组时更为方便灵活。
在用指针访问数组元素时,必须要注意指针的当前位置。
指针数组是指针的集合,它的各个元素都是指向同种数据类型的指针,指针数组常用于处理多个字符串。第6章介绍的命令行参数是指针数组的一个重要运用。
习题
-
接收输入的一个字符串(无空格、制表符等),将字符串中的小写字母转换为大写字母,输出转换后的字符串,最后必须输出回车。最长输入20个有效字符(不包括回车)。
例如,输入
apple,输出APPLE;如果字符串中包含了其他字符,均不进行转换,只转换小写字母为大写字母。例如:输入
test2test*,输出TEST2TEST*。 -
实现删除字符串中连续的重复字符(除字母和数字)。
输入为人字符串,将字符串中连续重复的,非字母和数字的字符删去,然后输出处理后的字符串。输入字符串最长50个字符,之后截断,只输出处理后的字符串。
例如:输入
1+++= =3,输出1+2=3。 -
实现逆序的
memcpy方法。已知字符指针source指向一个字符串;从source所指的内存地址的起始位置开始复制num个字节,逆序保存到字符指针destination所指的内存地址的起始位置中。
注意
本题为逆复制。source 指向位置,依次保存了 10,20,30,当 num=3 时,则逆序复制后 destination 指向的位置应该依次保存 30,20,10,保存为 functions.cpp。遇到异常情况,输出 error;否则,不要随意输出,会视为错误。