非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 用法 数组 指针的更多相关文章

  1. php数组指针函数

    数组指针函数有reset(),prev(),current(),next(),end(),key(),each() 其中reset(),prev(),current(),next(),end(),都是 ...

  2. PHP的七个数组指针函数

    1. PHP的七个数组指针函数 函数 描述 reset() 将一个数组的内部指针重置到首位,并返回第一个元素的值 end() 将一个数组的内部指针移动到数组的最后一个元素所在的位置,并返回最后一个元素 ...

  3. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  4. 数组/指针/const/字符串常量的使用传值问题

    #include<stdio.h> #include<string.h> int main() { ] = "abcd"; //常指针a指向字符串常量&qu ...

  5. Const用法总结(快速区分指针常量与常量指针)

    想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...

  6. int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

    恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...

  7. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  8. c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

    1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...

  9. 各类形参(引用,const,指针)

    #include <stdlib.h> #include <iostream> //这是一个关于引用形参,const形参,指针形参的程序,用于理解不同形式的区别 using n ...

随机推荐

  1. 力扣题目汇总(反转字符串中的单词,EXCEL表列序号,旋置矩阵)

    反转字符串中的单词 III 1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode ...

  2. (转)automaticallyAdjustsScrollViewInsets(个人认为iOS7中略坑爹的属性)

    转自http://m.blog.csdn.net/blog/humingtao2013/27662093 automaticallyAdjustsScrollViewInsets(个人认为iOS7中略 ...

  3. 剑指Offer(书):二叉树的镜像

    题目:操作给定的二叉树,将其变换为源二叉树的镜像. public void Mirror(TreeNode root) { if (root == null) { return ; } if (roo ...

  4. LeetCode695--岛屿的最大面积

    ''' 岛屿的最大面积 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着 ...

  5. python基础学习笔记——深浅拷贝

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 lst1 = ["⾦⽑狮王", "紫衫⻰王&qu ...

  6. mysql 面安装配置

    解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是:    "D:\Program Files\MySQL\mysql-5.6.13-win32&quo ...

  7. Django中的app及mysql数据库篇(ORM操作)

    Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都 ...

  8. loj2141 「SHOI2017」期末考试

    我们枚举每一个时间点,使得所有科目的时间都小于等于这个时间点,计算安排老师的代价和学生们的不满意度更新答案. 但是枚举太慢了,可以发现,时间点越早,学生们不满意度越小,安排老师的代价越高.即安排老师的 ...

  9. xfce-OpenVAS

    OpenVAS开源风险评估系统部署方案   OpenVAS,即开放式漏洞评估系统,是一个用于评估目标漏洞的杰出框架.功能十分强大,最重要的是,它是“开源”的——就是免费的意思啦- 它与著名的Nessu ...

  10. NYOJ 995 硬币找零

    硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...