C 和 C++ 字符串字面量
C 和 C++ 字符串字面量(String Literal)既有相同之处,又有一些区别。了解这些内容对于加深字符串字面量以及相关一些概念的理解、澄清一些常见的概念误区不无助益。本文以普通字符串字面量 "hello" 为例总结说明如下。
相同点:
字符串字面量是对象
C/C++ 中的对象(Object)指的是一块存储区。字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对象),也不需要象动态分配的对象那样进行动态分配。由于这个原因,用来限定变量的类型限定符(如 const、volatile)以及存储类别指示符(如 extern、static、auto、register)不能用在修饰字符串字面量上。
数组类型
字符串字面量是数组类型的对象,因而具有数组的一切特点。关于这一点在下面还会进一步说明。
静态存储期
C/C++ 中对象的生存期按照其存储性质可分为三类:静态存储期(static storage duration)、自动存储期(automatic storage duration)以及动态存储期(dynamic storage duration)。相应地,对象可根据存储期性质分为静态对象、自动对象和动态对象三种。
字符串字面量是静态对象,所以在程序运行期间会一直存在。
字符串字面量是左值,而且是不可被更改的左值
例如,char s[] = "hello"; 中的 “hello” 是数组类型的左值(lvalue),用于初始化 s 数组;sizeof( "hello" ) 以及 &"hello" 中的 "hello" 也都是左值。在这些情况下,"hello" 处于左值语义上下文环境中,所以不会产生下面将要提到的数组转换为指针的现象。
另外,有些运算不但要求其操作数是左值,还要求可变。例如,对对象进行赋值、自加、自减等运算。因为数组是不可被更改的左值,所以不能对数组进行这些操作,也就是说不存在数组类型的赋值、自加、自减等运算。
字符串字面量可以转换为指向其首第一个字符的指针
处于右值语义环境中的字符串字面量将被默认转换为指向第一个字符的指针。例如,char* p = "hello"; 中的 “hello” 在转换为字符指针后用于初始化指针变量 p;表达式 "hello"[0](相当于 *("hello" + 0) 或者 *"hello")中的 “hello” 也是同样转换为指针后参与下标运算,等等。
这种性质也是数组类型的特点。在右值语义环境下,一般类型的对象表示的值是由其存储内容决定的;而数组类型的对象与此不同,它代表的值不是来源于其内容,而是来源于数组对象首元素所在的地址。这是数组最为特殊的地
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
Boss说,要看OpenGL,看了快一个月,总算出了个像样的东西,用C写了个3D迷宫,
虽然只有350行
代码,不过边学边写,足足写了一周时间,还是小有成就感的,活活活!
&n ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......
//#include "stdafx.h"
/*
描述:纯c模拟类,纯c编写c++类,纯c实现c++类的简单范例,结构模拟类,struct 编写class.
c编写类是实现纯c编写com组件的基础。
*/
#include <stdio.h>
typedef struct _Vtbl
{
void (*AddRef)(struct CObject* obj,int);//所有的函数的第一个参数类似class的隐匿的 ......