问题来源
今天在阅读C++primer第五版的第197页时,谈到向main函数传递命令行参数,书中的说明是这样的:
这里argv是一个数组,它的元素不是指向字符的指针吗?
但实际上按照书上的说明,argv是一个数组,它的元素是指向C风格字符串的指针
问题的探究
一篇文章这样写道:
C风格字符串就是以’\0’结束的字符数组,字符串字面值就是C风格字符串,它以’\0’结尾,类型为const char*。如下:
char ca1[] = { 'C','+','+'};//没有'\0'结束符,不是C风格字符串
char ca2[] = { 'C','+','+','\0'};//有'\0'结束符,是C风格字符串
char ca3[] = "C++";//字符串字面值是C风格字符串,'\0'自动添加
char* cpp = "C++";//是C风格字符串,cpp可以指向不同的字符串,但是不能通过cpp修改“C++”,因为它不在栈区,存放在常量存储区,程序结束后由系统释放
可是cpp不应该是一个指向字符的指针吗?这里怎么是指向C风格字符串的指针。
问题解决
找到了以前的一本书,C程序设计(第四版)》(谭浩强)。根据这本书上第256页的说明,例如:
char *a=“woaini”;
此语句中,没有定义字符数组,只定义了一个char *型变量(字符型指针变量)a,用字符串常量对他初始化。C语言中对字符串常量是按照字符数组处理的,在内存中开辟了一个字符数组来存放该字符串常量,但是这个字符数组时没有名字的,不能通过数组名来引用,只能通过指针变量来引用。
对字符指针变量a初始化,实际上是把字符串中第一个元素的地址赋给指针变量a,使a指向字符串的第一个字符。
分析:
char *a="woaini"
等价于两行:
char *a;//定义一个char *型变量
a="woaini";//把字符串的第一元素的地址赋给字符指针变量a
"woaini"是一个字符串常量,C语言按照字符数组处理的,所以这里它代表的
首元素地址