字符串常量的定义与引用
同理"while(cStr[i] != '\0')"与"while(cStr[i])"是等价的。
当然,也可以使用scanf()函数的%s格式声明符输入字符串,详见程序清单 1.37。
程序清单 1.37 字符串的输入与输出范例程序
1 #include
2 int main(int argc, char *argv[])
3 {
4 char cStr[10];
5
6 scanf("%s", cStr);
7 printf("%s", cStr);
8 return 0
9 }
由于cStr代表字符数组的起始地址,因此不需要在cStr前添加&运算符。但采用%s格式符输入字符串存在一种潜在危险,如果输入的字符串太长,超出了字符数组的存储极限,则程序执行错误,因此可以使用"字段宽度"来限制输入字符串的长度更安全。
由于字符串常量的类型是char的数组,则在表达式中被解读为指针。即不管字符串有多长,pcStr始终存储字符串第一个字符的地址,因此使用指向字符串的指针变量即可整体引用一个字符串。比如:
char *pcStr = "OK!";
其中的pcStr是字符指针变量,其等效于
static const char t376[] = "OK!";
char *pcStr = t376;
其中的t376是编译器分配的一个内部变量名,不同编译器、不同程序、甚至同一个源代码每次编译,其名字均可能不同。显然,程序员不知道这个数组的名字,即匿名数组变量。显而易见,初始化字符数组存储字符串和初始化指针指向字符串的区别在于,数组名是常量,而指针名是变量,因此字符串的绝大多数操作都是通过指针完成的。
由此可见,"OK!"就是"char的数组",通过sizeof("OK!")也可以证明字符串的本质还是数组,即可用"OK!"作为数组变量名,详见程序清单 1.38。
程序清单 1.38 用字符串作为数组变量名范例程序
1 #include
2 int main(int argc, char argv *[])
3 {
4 printf("OK!占用的空间%d", sizeof("OK!")); // 输出"OK!"占用的空间,即4个字节
5 printf("OK!的地址%x\n", "OK!"); // 输出"OK!"的地址
6 printf("%c\n", *("OK!" + 1)); // 输出"OK!"的第1个元素,即'K'
7 printf("%c\n", "OK!"[0]); // 输出"OK!"的第0个元素,即'O'
8 printf("%d\n", "OK!"[3]); // 输出"OK!"第3个元素的值,即'\0'
9 return 0;
10 }
由于C语言允许对指针添加下标,因此程序清单 1.38(6~8
字符串 相关文章:
- 字符串的输入输出及相关函数(08-14)