字符串文字常量,指针,引用
2008-04-09 16:30
239 查看
1、关于字符串文字常量
sizeof("Bohr") == 5
字符串文字常量的类型是“适当个数的const字符的数组”,所以"Bohr"的类型就是const char[5]
下面的赋值是可以的:char* p = "Bohr";因为在C/C++原来的定义里,字符串文字常量的类型就是char*
字符串文字常量是静态分配的,他们被分配在程序的静态数据区,所以让函数返回字符串文字常量是安全的。
[code = c/c++]
const char* test()
{
// ...
return "test finish!"; // 正确,该字符串文字常量不会随函数的结束而销毁(因为它被分配在程序的静态数据区)。
}
[/code]
两个相同的字符串文字常量是否被分配在一起,取决于编译器实现。
[code = c/c++]
const char* p = "test";
const char* q = "test";
if (p == q) cont<<"one!/n"; // 结果随编译器而不同
[/code]
为使程序简洁,可以将长字符串分开书写,下面的书写方式也是正确的:
[code = c/c++]
char alpha[] = "abcdefgh"
"ijklmn";
[/code]
2、常量在定义时必须进行初始化
[code = c/c++]
const int num = 100; // ok
const int x; // wrong!
[/code]
3、常量指针和指针常量
[code = c/c++]
char* const cp; // 指向char的const指针
char const* cp; // 指向const char的指针
const char* cp; // 指向const char的指针
[/code]
可以这样理解:*代表指针,按照自右向左的顺序阅读。
cp is a const pointer to char
cp is a pointer to char const
cp is a pointer to const char
char const和const char是一样的。
4、不能将常量的地址赋给一个未加限制的指针
[code = c/c++]
const int c = 2;
int* pi = &c; // 错误:用const int* 来对int* 进行初始化
*pi = 3; // 这样,就造成来常量c的值可以被修改
[/code]
5、引用
引用的最明显的(也是最简单和最自然的)一种实现方式是作为一个常量指针,每次使用它的时候都自动做间接访问。所以:
[code = c/c++]
int ii = 0;
int& rr = ii;
rr++; // 是对ii加1,而不是将rr指向下一个位置
int* pp = &rr; // pp指向的是ii
[/code]
一些情况下,引用可以通过编译器的优化而去掉,使得在执行时根本不存在任何表示引用的东西。
引用在使用时必须初始化,对普通的T& 的初始式必须使用一个类型T的左值。左值是一个对象,可以取得它的地址。
[code = c/c++]
double& dr = 1; // 错误:要求左值
[/code]
但是,const T& 的初始式不必是左值
[code = c/c++]
const double& cdr = 1; // ok
[/code]
这相当于
[code = c/c++]
double temp = double(1); // 首先建立一个具有正确值的临时变量
const double& cdr = temp; // 用临时变量作为引用的初始式
[/code]
sizeof("Bohr") == 5
字符串文字常量的类型是“适当个数的const字符的数组”,所以"Bohr"的类型就是const char[5]
下面的赋值是可以的:char* p = "Bohr";因为在C/C++原来的定义里,字符串文字常量的类型就是char*
字符串文字常量是静态分配的,他们被分配在程序的静态数据区,所以让函数返回字符串文字常量是安全的。
[code = c/c++]
const char* test()
{
// ...
return "test finish!"; // 正确,该字符串文字常量不会随函数的结束而销毁(因为它被分配在程序的静态数据区)。
}
[/code]
两个相同的字符串文字常量是否被分配在一起,取决于编译器实现。
[code = c/c++]
const char* p = "test";
const char* q = "test";
if (p == q) cont<<"one!/n"; // 结果随编译器而不同
[/code]
为使程序简洁,可以将长字符串分开书写,下面的书写方式也是正确的:
[code = c/c++]
char alpha[] = "abcdefgh"
"ijklmn";
[/code]
2、常量在定义时必须进行初始化
[code = c/c++]
const int num = 100; // ok
const int x; // wrong!
[/code]
3、常量指针和指针常量
[code = c/c++]
char* const cp; // 指向char的const指针
char const* cp; // 指向const char的指针
const char* cp; // 指向const char的指针
[/code]
可以这样理解:*代表指针,按照自右向左的顺序阅读。
cp is a const pointer to char
cp is a pointer to char const
cp is a pointer to const char
char const和const char是一样的。
4、不能将常量的地址赋给一个未加限制的指针
[code = c/c++]
const int c = 2;
int* pi = &c; // 错误:用const int* 来对int* 进行初始化
*pi = 3; // 这样,就造成来常量c的值可以被修改
[/code]
5、引用
引用的最明显的(也是最简单和最自然的)一种实现方式是作为一个常量指针,每次使用它的时候都自动做间接访问。所以:
[code = c/c++]
int ii = 0;
int& rr = ii;
rr++; // 是对ii加1,而不是将rr指向下一个位置
int* pp = &rr; // pp指向的是ii
[/code]
一些情况下,引用可以通过编译器的优化而去掉,使得在执行时根本不存在任何表示引用的东西。
引用在使用时必须初始化,对普通的T& 的初始式必须使用一个类型T的左值。左值是一个对象,可以取得它的地址。
[code = c/c++]
double& dr = 1; // 错误:要求左值
[/code]
但是,const T& 的初始式不必是左值
[code = c/c++]
const double& cdr = 1; // ok
[/code]
这相当于
[code = c/c++]
double temp = double(1); // 首先建立一个具有正确值的临时变量
const double& cdr = temp; // 用临时变量作为引用的初始式
[/code]
相关文章推荐
- C语言回顾(六、基类型,数组指针,字符串指针,函数指针,文字常量区)——iOS开发基础
- 引用、常指针、常引用、指针常量、引用常量
- 字符串常量与字符串指针的认识
- C++ 引用和指针的区别 常量指针和指针常量的区别
- 指针数组,数组指针,傻傻分不清?常量指针,指针常量到底谁不变?数组引用,引用数组,到底有没有?
- "显微镜"下细看字符串常量初始化数组和指针
- C++ 语法实验室之指针、常量const、字符串和等号初学误区理解
- [*注意指向常量的字符指针变量*]用指向常量的字符指针变量和字符数组方法把字符串a复制到字符串b中
- 指针到底能不能修改其指向的常量字符串?
- 如果从函数中返回局部变量的地址,引用或者指针的形式,则变量类型必须是静态的或者常量,即不在栈中存储
- 辨析c++的常量指针、指针常量,引用
- 关于常量指针的引用
- 文字常量区,字符串常量
- 指针常量字符串
- 字符数组 字符指针 字符串常量
- 用字符数组和字符串指针定义字符串常量时需要注意的一点
- 常量指针和引用的实践
- C++中 常量引用、指向常量的指针、常量指针的区别
- 定义字符指针数组分别指向5个字符串常量,从小到大输出字符串内容
- 使用指针引用的方法和二维指针的方法交换两个字符串