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;
c++引用和const 用法 数组 指针的更多相关文章
- php数组指针函数
数组指针函数有reset(),prev(),current(),next(),end(),key(),each() 其中reset(),prev(),current(),next(),end(),都是 ...
- PHP的七个数组指针函数
1. PHP的七个数组指针函数 函数 描述 reset() 将一个数组的内部指针重置到首位,并返回第一个元素的值 end() 将一个数组的内部指针移动到数组的最后一个元素所在的位置,并返回最后一个元素 ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- 数组/指针/const/字符串常量的使用传值问题
#include<stdio.h> #include<string.h> int main() { ] = "abcd"; //常指针a指向字符串常量&qu ...
- Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...
- int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针
恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...
- C++之常指针,指针常量,函数指针,const用法总结
1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...
- c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针
1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...
- 各类形参(引用,const,指针)
#include <stdlib.h> #include <iostream> //这是一个关于引用形参,const形参,指针形参的程序,用于理解不同形式的区别 using n ...
随机推荐
- scrollTop如何实现click后页面过渡滚动到顶部
用JS操作,body元素的scrollTop var getTop = document.getElementById("get-top"); var head = documen ...
- day03变量补充和数据类型
1.变量的内存管理机制 引用计数:存放值的内存地址绑定的变量个数 垃圾:引用计数为0的内存地址 引用计数增加: age = 18 x = age 引用计数减少: ①age = 19 ②del x 值的 ...
- Memcached特性及优缺点
为了加快文件访问速度且提供多个使用者.需要在内存中建立内存缓存数据的管理减小读写磁盘的次数及保证数据的更新.因为需要使用cache缓存. 1.Memcached 主要特性 a.数据仅存在于内存中, ...
- 打印 Python 的一切 —— pprint & beeprint
打印,是所有程序员从小白时期就具备的神技,遇事不决打印一下,是 DEBUG 最简单且不依赖 IDE 的方式,自定义各种日志输出,也是项目成型后必备功能.但是为了优雅的打印格式,往往需要对各种对象进行特 ...
- 【SaltStack】通过Master给Minion安装MySQL
一.IP信息说明 [Master] IP: 192.168.236.100 [Minion] IP: 192.168.236.101 二.配置SaltStack 关于SaltStack Master和 ...
- 关于学习Mongodb的几篇文章
一.Mongodb分片的使用 http://www.caiyiting.com/blog/2014/mongodb-sharding.html 二.MongoDB分布式高可用集群实现 http://w ...
- django 常见过滤器
一.形式:小写 {{ name | lower }} 二.过滤器是可以嵌套的,字符串经过三个过滤器,第一个过滤器转换为小写,第二个过滤器输出首字母,第三个过滤器将首字母转换成大写 标签 {{ st ...
- Exchange 2010 打补丁的顺序
升级的顺序: 客户端访问服务器 ——> 集线器传输服务器 ——>统一消息服务器(如果有的话)——> 邮箱服务器 ——> 边缘服务器.
- python知识点拾遗
内容概要 1.__str__ 2.os.path相关方法 1.__str__ 我们先定义一个Student类,打印一个实例: class Student(object): def __init__(s ...
- Java-在一个包装器对象中包装一个原始类型
使用基本类型的包装对象,好处可以为空且可以序列化 package com.tj; public class MyClass2 { public static void main(String[] ar ...