没有合适的资源?快使用搜索试试~ 我知道了~
C语言程序设计要点 2017-12-081
需积分: 0 0 下载量 93 浏览量
2022-08-03
18:26:07
上传
评论
收藏 657KB PDF 举报
温馨提示
试读
11页
4. Wednesday 5. Thursday 7. Saturday
资源详情
资源评论
资源推荐
8.4.2 指向字符的指针、字符数组和字符串
字符数组常常用作字符串来使用。这里提醒读者,作为字符串的字符数组的末尾必须有一个
‘\0’作为结束标志。不过,字符数组的使用总有些不太方便,因此经常用字符指针来表示字符
串。请看如下声明:
char str1[] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’ };
char str2[] = “Hello”;
char *str3 = “Hello”;
这里,用了 3 种不同的方式来声明字符串。虽然表面上看它们的效果一样,但实际的内部实
现是完全不同的。
str1 是数组而非指针,它的长度是 6。str1 数组被一系列字符常量初始化。
str2 也是数组而非指针,它的长度是 6。str2 数组被长度为 5 的字符串常量初始化。
在初始化时,字符串常量的每一个字符被复制到了数组 str2 的对应元素中,包括结尾‘\0’。
str3 是指针而非数组,它被初始化指向了一个字符串常量。换句话说就是,str3 获得
了字符串的首地址,也就是字符‘H’的地址。
str1 和 str2 数组的每一个元素都是变量,因此可以被改变;而 str3 本身是个变量
(它可以指向任意其他的字符串),但现在它指向了一串常量,而常量串中的每一个字符都不
能被修改。
【例 8-11】指针、字符数组和字符串。
//8-11.c
#include <stdio.h>
int main()
{
char str1[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char str2[] = "Hello";
char *str3 = "Hello";
printf("%s\n%s\n%s\n", str1, str2, str3);
str1[0] = 'h';
str2[0] = 'h';
//str3[0] = 'h'; //
这条语句会引起一个运行时错误
printf("%s\n%s\n%s\n", str1, str2, str3);
return 0;
}
程序的运行结果是:
Hello
Hello
Hello
hello
hello
Hello
在将字符指针作为字符串对待时,应该注意以下问题:
(1)含义问题。如例中所示,表达式 str3 代表了字符串,而*str3 则是一个字符;
(2)超界问题。指针和数组(包括字符串)连用总是存在这个问题,并且不好把握。幸好字
符串有一个结尾标志,可以通过指针是否指向了这个标志来判断;
(3)初始化问题。未初始化的指针是不能使用的,这点读者都已经知道。特别是在输入字符
串的时候,往往需要用一个足够大的字符数组来缓存,然后通过一个指针来访问该数组。
【例 8-12】从键盘输入一个字符串,求出它的长度。
//8-12.c
#include <stdio.h>
int main()
{
char str[80];
char *p;
printf("Please input a string:\n");
gets(str);
p = str;
while (*p != '\0') p++;
printf("The length of the string is %d.\n", p – str);
return 0;
}
运行结果如下:
Please input a string:
to be or not to be, it's a question.
↙
The length of the string is 36.
代码中用到了一个技巧:首先将指针从字符串的头移到尾,然后求头尾之间地址的差(以单
元计)。由于一个字符单元的大小是 1 字节,因此这个差恰好就是字符串的长度。
在程序中移动字符指针到串尾的语句是:
while (*p != '\0') p++;
而这条语句常常被程序员精简为:
while (*p++);
--p;
8.4.3 指针数组
数组元素的基类型可以是任意类型,也包括了指针类型。由指针构成的数组就是指针数组。
例如:
char *weekday[7];
现在解析这个声明如下。
(1)先解析出变量名 weekday。
(2)weekday 前后都有修饰符,但“[]”的优先级高于“*”,因此 weekday 先与“[]”结
合。这样,weekday 就不是指针,而是一个数组,并且是一维的,其长度为 7。
(3)weekday 前面的所有符号都是它的基类型。此例中是 char *。因此,weekday 数组的
每一个元素都是指针,这些指针指向了字符单元。根据前面的讲解,这些字符指针往往作为字
符串使用。
将声明扩展一下,为数组的每个元素赋初值:
char *weekday[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday" };
该声明的内存布局情况如图 8-10 所示。
【例 8-13】指针数组的使用。
//8-13.c
#include <stdio.h>
int main()
{
const int WEEK = 7;
char *weekday[] = { "Sunday",
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday" };
int i;
printf("Weekdays\n-------------
---\n");
for (i = 0; i < WEEK; i++)
printf("%d. %s\n", i + 1,
weekday[i]);
printf("Please choose a number:\n");
scanf("%d", &i);
if (i >= 1 && i <= WEEK)
printf("You chose %s\n", weekday[i-1]);
else
printf("You chose an illegal one.\n");
return 0;
}
程序的运行结果是:
Weekdays
----------------
1. Sunday
2. Monday
3. Tuesday
4. Wednesday
5. Thursday
6. Friday
7. Saturday
Please choose a number:
4
↙
You chose Wednesday
Weekday[0]
Weekday[1]
Weekday[2]
Weekday[3]
Weekday[4]
Weekday[5]
Weekday[6]
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
图 8-10 指针数组
剩余10页未读,继续阅读
XU美伢
- 粉丝: 22
- 资源: 341
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0