c++引用和const 用法 数组 指针
非const引用,只能用object为其赋值; 《c++primer》P52
而const引用则可以用临时变量为其赋值;
如:
const int &r = 32;//可以
int &rr = 32 // error
而且:
非const引用只能绑定到与该引用同类型的对象;
const引用则可以绑定到不同但相关的类型的对象或绑定到右值;//左值:可以出现在赋值语句的坐标或右边;右值:只能出现在赋值的右边。
当进行string对象和字符串字面值混合连接操作是,+操作符的左右操作数必须至少有一个是string类型
1、
字符指针数组创建:
char **parr = new char*[n];
。。。。
//释放各个字符数组
for(i = 0; i != n; ++i)
delete [] parr[i];
// 释放字符指针数组
delete [] parr;
2、《c++ primer》P117
动态分配数组是,如果数组元素具有类类型,将用该类的默认构造函数实现初始化,如果数组元素是内置类型,则无初始化:
string *psa = new string[10]; //array of empty strings
int *pia = new int[10]; //array of uninitialized ints
//因为数组元素都是const对象,无法赋值。所以只能对数组做值初始化,《C++primer 》P118
int const *par = new const int[10]; //错误,没有初始化;
int const *par = new const int[10]();// 正确,初始化了,
C++允许定义类类型的const数组,但该类类型必须提供默认构造函数;
const string *p = new const string[10];//正确,array of 10 empty strings。
C++ 虽然不准定义长度为0的数组变量,但是明确指出,调用new动态穿件长度为0的数组是合法的。
char arr[0]; //error
char *p = new char [0]; //ok
问题:
#include<iostream>
#include<vector>
#include<string> using namespace std; int main()
{
vector<string> vec;
string str;
cout << "please some strings end up with (Ctrl + D):\n";
while(cin >> str)
vec.push_back(str); char **parr = new char*[vec.size()];
size_t i = ;
for(vector<string>::const_iterator ite = vec.begin(); ite != vec.end(); ++ite, ++i)
{
cout << *ite << "\t";
char *p = new char[(*ite).size() + ];
strcpy(p, (*ite).c_str());
//strcpy(parr[i], (*ite).c_str());
parr[i] = p;
}
cout << endl;
for(size_t i = ; i != vec.size(); ++i)
{
cout << parr[i];
delete [] parr[i];
}
delete [] parr; return ;
}
上面代码可以正常运行;
但是注释掉20,21,23行,用23行,则提示段错误,
即使把15行改为下面的样子也不行:
char **parr = new char*[vec.size()]();
可见不能用
strcpy(parr[i], (*ite).c_str());
却可以用21行:
strcpy(p, (*ite).c_str());
总结:
当用new建立指针(*P)时,分配了空间,而且分配的空间是没有用的,
但是建立指针额指针(**p)是,内存指针的指向是不定的,也许是系统真用的,所以冒然用strcpy(p[i],string.c_str())会把原来的内容代替,
造成段错误。所以不可以那样用。
而且string.c_str()返回的是const char类型的数组,不可以赋值给非const的数组或者指针。
字符串字面值得类型就是const char 类型的数组----《c++primer》P113
3、多维数组和指针:
int ia[3][4]; //array of size 3,each element is an array of ints of size 4
int (*ip)[4]; //ip points to an array of 4 ints
ip = &ia[2]; //ia[2]is an array of 4 ints
int *ip[4]; //array of points to int
int (*ip)[4]; // pointer to an array of 4 ints
typedef int int_array[4];
int_array *ip = ia;
for(int_array *p = ia; p != ia+3; ++p)
for(int *q = *p; q != *p + 4; ++q)
cout << *q << endl;
typedef string *pstring;
const pstring cstr;
上面等价于:
string *const cstr;
下面两个也等价:
string const s1;
const string s2;
/////////////////////// 《C++ primer》P112
string s;
typedef string *pstring;
const pstring cstr1 = &s;//这三个等价,都是const指针;
pstring const cstr2 = &s;
string *const cstr3 = &s;
最新文章
- Jquery 数组操作
- The import javax.servlet.http.HttpServletRequest cannot be resolved
- ubuntu 清除缓存
- web自定义控件UserControl
- dig out deledted chat messages
- JdbcTemplate 、NamedParameterJdbcTemplate、SimpleJdbcTemplate的区别
- linux设置语言编码
- P2P中的NAT穿越方案简介
- OpenCms创建网站过程图解——献给OpenCms的初学者们
- yii2自带的backend,frontend不够用,添加一个后台模块怎么做?
- C语言二维数组实现扫雷游戏
- Object.create()和new object()和{}的区别
- struct 和typedef struct
- Django连接Oracle数据库配置
- string Type
- Linux和Windows下tomcat开机自启动设置
- 元素的class和id问题
- 面试3——java集合类总结(List)
- Windows10下安装Maven以及Eclipse安装Maven插件 + 创建Maven项目
- JS之滚动条效果
热门文章
- CSS盒模型-box-sizing
- pandas模块(很详细归类),pd.concat(后续补充)
- pyhton链式赋值在可变类型/不可变类型上的区别以及其本质
- python datetime,time时间格式和用法
- centos 安装 yum apt
- 剑指offer面试题43:n个筛子的点数
- HTTP/1.1协议支持的8种请求方法
- linux系统管理员 第五部分 1认识系统服务
- 【LeetCode】Maximum Depth of Binary Tree(二叉树的最大深度)
- [android开发篇]自定义权限