关于C风格字符串的一些问题

问题来源

今天在阅读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语言按照字符数组处理的,所以这里它代表的
首元素地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值