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; © = %p; value = %p\n", 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!; © = 0x0012ff44; value = 0x0040a000
我们来仔细分析最后两个 printf()
的输出。首先第1项, mesg
和 copy
都以字符串形式输出( %s
转换说明)。这里没问题,两个字符串都是 "Don't be a fool!"
。
接着第2项,打印两个指针的地址。如上输出所示,指针 mesg
和 copy
分别存储在地址为 0x0012ff48
和 0x0012ff44
的内存中。
注意最后一项,显示两个指针的值。所谓指针的值就是它存储的地址。 mesg
和 copy
的值都是 0x0040a000
,说明它们都指向的同一个位置。因此,程序并未拷贝字符串。语句 copy = mesg;
把 mesg
的值赋给 copy
,即让 copy
也指向 mesg
指向的字符串。
为什么要这样做?为何不拷贝整个字符串?假设数组有50个元素,考虑一下哪种方法更效率:拷贝一个地址还是拷贝整个数组?通常,程序要完成某项操作只需要知道地址就可以了。如果确实需要拷贝整个数组,可以使用 strcpy()
或 strncpy()
函数,本章稍后介绍这两个函数。
我们已经讨论了如何在程序中定义字符串,接下来看看如何从键盘输入字符串。