当前位置:嗨网首页>书籍在线阅读

04-指针和字符串

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.1.2 指针和字符串

读者可能已经注意到了,在讨论字符串时或多或少会涉及指针。实际上,字符串的绝大多数操作都是通过指针完成的。例如,考虑程序清单11.5中的程序。

程序清单11.5  p_and_s.c 程序

/* p_and_s.c -- 指针和字符串 */
#include <stdio.h>
int main(void)
{
     const char * mesg = "Don't be a fool!";
     const char * copy;
     copy = mesg;
     printf("%s\n", copy);
     printf("mesg = %s; &mesg = %p; value = %p\n", mesg, &mesg, mesg);
     printf("copy = %s; &copy = %p; value = %p\n", copy, &copy, copy);
     return 0;
}

注意 如果编译器不识别 %p ,用 %u%lu 代替 %p

你可能认为该程序拷贝了字符串 "Don't be a fool!" ,程序的输出似乎也验证了你的猜测:

Don't be a fool!
mesg = Don't be a fool!; &mesg = 0x0012ff48; value = 0x0040a000
copy = Don't be a fool!; &copy = 0x0012ff44; value = 0x0040a000

我们来仔细分析最后两个 printf() 的输出。首先第1项, mesgcopy 都以字符串形式输出( %s 转换说明)。这里没问题,两个字符串都是 "Don't be a fool!"

接着第2项,打印两个指针的地址。如上输出所示,指针 mesgcopy 分别存储在地址为 0x0012ff480x0012ff44 的内存中。

注意最后一项,显示两个指针的值。所谓指针的值就是它存储的地址。 mesgcopy 的值都是 0x0040a000 ,说明它们都指向的同一个位置。因此,程序并未拷贝字符串。语句 copy = mesg;mesg 的值赋给 copy ,即让 copy 也指向 mesg 指向的字符串。

为什么要这样做?为何不拷贝整个字符串?假设数组有50个元素,考虑一下哪种方法更效率:拷贝一个地址还是拷贝整个数组?通常,程序要完成某项操作只需要知道地址就可以了。如果确实需要拷贝整个数组,可以使用 strcpy()strncpy() 函数,本章稍后介绍这两个函数。

我们已经讨论了如何在程序中定义字符串,接下来看看如何从键盘输入字符串。