概述
表示字符串的几种方式
// strings1.c
#include <stdio.h>
#define MSG "I am a symbolic string constant."
#define MAXLENGTH 81
int main(void)
{
char words[MAXLENGTH] = "I am a string in an array.";
const char * pt1 = "Something is pointing at me.";
puts("Here are some strings:");
puts(MSG);
puts(words);
puts(pt1);
words[8] = 'p';
puts(words);
return 0;
}
/*
Here are some strings:
I am an old-fashioned symbolic string constant.
I am a string in an array.
Something is pointing at me.
I am a spring in an array.
*/
和printf()函数一样,puts()函数也属于stdio.h系列的输入/输出函数。
但是,与printf()不同的是,puts()函数只显示字符串,而且自动在显示的字符串末尾加上换行符。
数组和指针
字符数组名和其他数组名一样,是该数组首元素的地址。
因此,假设有下面的初始化:
char car[10] = "Tata";
那么,以下表达式都为真:
car == &car[0]、
*car == 'T'、
*(car+1) == car[1] == 'a'。
还可以使用指针表示法创建字符串。
例如,程序清单11.1中使用了下面 的声明:
const char * pt1 = "Something is pointing at me.";
该声明和下面的声明几乎相同:
const char ar1[] = "Something is pointing at me.";
以上两个声明表明,pt1和ar1都是该字符串的地址。
在这两种情况下, 带双引号的字符串本身决定了预留给字符串的存储空间。
尽管如此,这两种形式并不完全相同。
初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。
初始化字符数组来储存字符串和初始化指针来指向字符串有何区别 (“指向字符串”的意思是指向字符串的首字符)?
例如,假设有下面两个声明:
char heart[] = "I love Tillie!";
const char *head = "I love Millie!";
两者主要的区别是:
数组名heart是常量,而指针名head是变量。
那么, 实际使用有什么区别?
首先,两者都可以使用数组表示法:
for (i = 0; i < 6; i++)
putchar(heart[i]);
putchar('n');
for (i = 0; i < 6; i++)
putchar(head[i]);
putchar('n');
上面两段代码的输出是:
I love
I love
其次,两者都能进行指针加法操作:
for (i = 0; i < 6; i++)
putchar(*(heart + i));
putchar('n');
for (i = 0; i < 6; i++)
putchar(*(head + i));
putchar('n');
输出如下:
I love
I love
但是,只有指针表示法可以进行递增操作:
while (*(head) != '