• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c++引用和const用法数组指针

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  非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

 

问题:

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9         vector<string> vec;
10         string str;
11         cout << "please some strings end up with (Ctrl + D):\n";
12         while(cin >> str)
13                 vec.push_back(str);
14 
15         char **parr = new char*[vec.size()];  
16         size_t i = 0;
17         for(vector<string>::const_iterator ite = vec.begin(); ite != vec.end(); ++ite, ++i)
18         {    
19                 cout << *ite << "\t";
20                 char *p = new char[(*ite).size() + 1]; 
21                 strcpy(p, (*ite).c_str());
22                 //strcpy(parr[i], (*ite).c_str());
23                 parr[i] = p;
24         }
25         cout << endl;
26         for(size_t i = 0; i != vec.size(); ++i)
27         {
28                 cout << parr[i];
29                 delete [] parr[i];
30         }
31         delete [] parr;
32 
33         return 0;
34 }   

 

上面代码可以正常运行;

但是注释掉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;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#LiveUpdate.exe实现文件在线更新升级发布时间:2022-07-13
下一篇:
C#编程(三十)----------泛型结构,泛型方法,泛型委托发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap