返回介绍

6.5.3 指针与字符数组

发布于 2025-04-11 22:33:00 字数 1915 浏览 0 评论 0 收藏 0

由于字符串常量不可被修改,因此,我们经常会将字符串存储在字符数组中,以便对字符串进行更好的处理。例如:

char str[] = "apple";

定义了字符数组 str,并将字符串常量 apple 作为其初始值。编译器根据字符串常量中字符个数确定出数组的长度为 6,并将字符串中的 5 个字符以及作为字符串结束标记的空字符初始化给数组各元素。

由于数组名可以看成是指向首元素的指针,因此,可以使用该指针来访问字符串。例如:

printf("string: %s\n", str);

编译运行程序,结果如下:

string: apple

并且,可以通过指针来修改字符串。例如:

*str = 'A';

通过解引用,将大写字母 A 赋值给指针所指向的对象,即数组首元素。由于这次修改的是存储在字符数组中的字符串,并非字符串常量,因此是没问题的。可以再次通过 printf 函数来打印字符数组中的字符串。代码如下:

char str[] = "apple";
*str = 'A';
printf("string: %s\n", str);

编译运行程序,结果如下:

string: Apple

字符数组中所存储的字符串,其首字符已经被修改为大写字母 A 了。

例 6-3 】编写程序,要求使用指针将字符串“Tel:017No.88#”中所有的小写字母转换为大写字母,并打印输出。

为了能够对字符串进行修改,将该字符串存储到一个字符数组中:

char str[] = "Tel:017No.88#";

然后使用一个无限的 while 循环,利用指针 str 遍历字符串中的所有字符。由于数组名是一个指针常量,它的指向不可被修改,只能指向首元素。因此,需要使用指针的运算方式来访问数组元素,所以在循环之前定义了一个 int 类型变量 i,并将其初始化为 0。代码如下:

由于这里的 while 是个无限循环,因此,在循环体内需要有结束循环的 break 语句。在循环体的开头通过 if 语句进行结束循环的条件检查,而结束循环的条件是访问到作为字符串结束标记的空字符。

如果访问到的不是空字符,就使用 islower 函数来检测该字符是否为小写字母,如果是,则将该小写字母的 ASCII 码值减去 32,以得到对应的大写字母,并重新赋值给自己。

每次循环都会使变量 i 的值自增,不然每次访问的都是数组首元素(即字符串中的首字符),永远也无法访问到空字符,就变成无限循环了。

编译运行程序,结果如下:

TEL:017NO.88#

可见,字符串中的小写字母都被修改为对应的大写字母了。

由于数组名作为指针时,它的指向不能被改变。因此,很多时候会另外再定义一个指针变量,并通过指针移动的方式对字符数组中的元素进行访问。程序代码如下:

以上语句首先定义指针变量 p,并将数组名 str 作为其初始值,即将数组首元素的内存地址初始化给指针变量 p。这次 while 循环的条件为指针 p 所指向的字符是否为空字符,如果是空字符,则循环结束,如果不是空字符,则执行循环体。循环体内再次检测指针 p 所指向字符是否为小写字母,如果是,则将其转换为大写字母。最后通过自增运算,使指针 p 向前移动,即让指针 p 指向数组的下一个元素,也就是下一个字符。

执行程序,会得到与之前相同的结果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。