问题: a. 为什么字符数组可以直接使用字符串赋值,如char * s="hello,world!"
b. 字符数组和字符串又是什么关系?
a. 字符串常量是一个字符数组
b. 字符串常量是可以通过指向其第一个元素的指针访问
(摘自于在丹尼斯.里奇的《C语言程序设计》P103,第5章第5节)
字符数组可以赋值给字符指针( char array[]={'a','b'} ; char * p =arry;),所以字符串就可以直接赋值给字符数组。 过程如下:
1 . 定义一个字符数组(字符串),程序运行时,系统申请一块内存地址存放这些字符。
2. 如果将字符数组或字符串赋值给字符指针时,系统其实是把字符数组(字符串)的首地址放到指针变量中(也叫指针指向首个字符地址)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * c="hello,world!";
printf("字符串为 :%s\n" ,c); /* 打印出字符串 */
printf("字符串开始地址为 :%p\n" ,c); /* 打印出字符串首地址 */
system("pause");
}
运行结果为:
如上图,对于同一个字符指针变量c, 可以通过 printf("%s",c) 输出字符串内容“hello,world”,因为C语言规定 字符串常量是可以通过指向其第一个元素的指针访问 ;printf("%p",c)可以输出字符串的首个地址00305774,因为指针本身就是一个存放(指向)地址的变量。
实际上C语言中没有提供整个字符串做为一个整体进行处理的运算符,那么想要对整个字符串整体操作,只能对指向它的指针操作。标准库中 的string,对字符串的操作,其实就是对其指针的操作。
小提示:
char * pMsg="hello"; printf("%s\n",pMsg) /* 打印的是字符串 hello */
char * pMsg="hello"; printf("%c\n",*pMsg); /* 打印的是字符h */
char * pMsg="hello"; printf("%x\n",pMsg) /* 打印的是地址 */
如果码友对此有更好更通俗易懂的解释,请在下方留言!