char型字符串(数组)与string型字符串 指针与引用

时间:2022-02-12 03:16:12

一、常指针:

int *const p;    //指针不可改变,但是指针指向的数据可以改变。

指向常量的指针:

const int *p;    //指针可以改变,但是指针指向的数据不可以改变。

指向常量的常指针:

const int *const p;    //指针不可改变,且指针指向的数据也不可改变。

引用就是别名,定义引用的同时必须要对引用进行初始化。

二、利用引用返回多个值:

引用就是别名,引用必须要初始化。

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
void func(int &a,int &b,int &c);
int main()
{
int a=;
int b=;
int c=;
cout<<"主函数,计算前。。。"<<endl;
cout<<a<<"\t"<<b<<"\t"<<c<<endl;
func(a,b,c);
cout<<"主函数,计算后。。。"<<endl;
cout<<a<<"\t"<<b<<"\t"<<c<<endl;
return ;
}
void func(int &a,int &b,int &c)
{
cout<<"func函数,计算前。。。"<<endl;
cout<<a<<"\t"<<b<<"\t"<<c<<endl;
a=a+;
b=(b)*(b);
c=(c)*(c)*(c); //
cout<<"func函数,计算后。。。"<<endl;
cout<<a<<"\t"<<b<<"\t"<<c<<endl;
}

三、删除空指针是不会报错的。

int *p;
p=new int;

delete p;

p=0;        //将指针赋值为空,假如没有这句,程序将崩溃。

delete p;

四、删除堆中指针后,只是释放了指针所指向的内存单元,指针仍然存在,且依然指向删除前的内存地址

int *p=new int(11);

cout<<"删除指针p前其指向的内存地址:"<<p<<endl;

delete p;

cout<<"删除指针p后其指向的内存地址:"p<<endl;

程序输出结果:

char型字符串(数组)与string型字符串 指针与引用

所以,为了保证程序的安全可靠,需要在delete p后加上p=0

五、类的对象的this指针

对象的this指针存储该对象的内存地址。

#include "stdafx.h"
#include <iostream>
//#include <string>
//#include <limits>
using namespace std; class A
{
private:
int i;
public:
void set(int x){this->i=x;cout<<"this指针的指向的内存地址为:"<<this<<endl;}
//也可以直接写成i=x;
}; int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.set();
cout<<"对象的内存地址为:"<<&a<<endl;
return ;
}

//运行结果如下图所示

char型字符串(数组)与string型字符串 指针与引用

六、使用引用时容易犯错的地方

临时变量生存期的问题

#include "stdafx.h"
#include <iostream>
using namespace std; class A
{
private:
int x;
public:
A(int i){x=i;}
void get(){cout<<x<<endl;}
~A(){}
}; A &func(); int _tmain(int argc, _TCHAR* argv[])
{
A &ra=func();
ra.get();
return ;
} A &func()
{
A a(); //a为临时对象,func函数一旦结束,其生存周期也结束,立即销毁
return a;
}

可以看到最后返回的是一个随机数,这就是临时变量被提前删除的缘故

char型字符串(数组)与string型字符串 指针与引用

若将func()函数前面的&去掉,则可正确返回a对象的成员变量的值。

char型字符串(数组)与string型字符串 指针与引用

此时函数按值返回,对象a的副本生命周期会一直持续到main()函数结束。

这是因为,作为引用的临时变量(即A &ra=func();),其生存周期不会短于该引用。

七、按值传递传递的是变量的副本,按址传递,顾名思义肯定是传送的地址了。

八、关于二维(数组)指针的一些理解问题

int ** Ptr <==> int Ptr[ x ][ y ];

   int *Ptr[ 5 ] <==> int Ptr[ 5 ][ x ];

int ( *Ptr )[ 5 ] <==> int Ptr[ x ][ 5 ];

这里 x 和 y 是表示若干的意思。(转)

测试代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int (*p)[]=new int[][];
cout<<"指针数组的初始地址:"<<p<<endl;
int i,j;
int a[][]={,,,};
cout<<"二维数组的初始地址:"<<a<<endl<<endl;;
cout<<"自定义赋值初始化指针数组!!!"<<endl;
for (i=;i<;i++)
for (j=;j<;j++)
{ p[i][j]=i+j; }
//cout<<endl<<"使用二维数组初始化数组指针!!!"<<endl;
//p=a; //使用二维数组初始化数组指针
cout<<"赋值后指针数组的地址:"<<p<<endl;
for (i=;i<;i++)
{
for (j=;j<;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
delete[] p;
p=;
return ;
}

程序输出:自定义赋值初始化指针数组!

char型字符串(数组)与string型字符串 指针与引用

下面对以上代码稍作修改,使用二维数组赋初值给指针数组。

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int (*p)[]=new int[][];
cout<<"指针数组的初始地址:"<<p<<endl;
int i,j;
int a[][]={,,,};
cout<<"二维数组的初始地址:"<<a<<endl<<endl;;
/*cout<<"自定义赋值初始化指针数组!!!"<<endl;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
{ p[i][j]=i+j; }*/
cout<<endl<<"使用二维数组初始化数组指针!!!"<<endl;
p=a; //使用二维数组初始化数组指针
cout<<"赋值后指针数组的地址:"<<p<<endl;
for (i=;i<;i++)
{
for (j=;j<;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
//delete[] p;
//p=0;
return ;
}

程序输出:(delete[] p必须注释掉否则程序会崩溃。)

char型字符串(数组)与string型字符串 指针与引用

九、复制构造函数

#include <stdafx.h>
#include<iostream>
using namespace std;
class A
{
private:
int m,n;
public:
A(int i,int j){m=i;n=j;} //构造函数
A(A&temp){m=temp.m;n=temp.n;} //复制构造函数
void print(){cout<<m<<"\t"<<n<<endl;}
};
int main()
{
A a(,);
a.print(); A b(a); //or A b=a;也可以
b.print();
return ;
}

浅复制:(被复制对象的变量与复制对象的变量享有同样的内存空间)

#include <stdafx.h>
#include<iostream>
using namespace std;
class A
{
private:
int *x;
public:
A(){x=new int;*x=;}
~A(){delete x;x=;}
A (const A&temp){x=temp.x;}
void display(){cout<<*x<<"\t"<<&x<<endl;}
void set(int i){*x=i;}
};
int main()
{
A *a=new A;
a->display(); A b(*a);
b.display(); a->set();
a->display();
b.display(); b.set();
a->display();
b.display(); //delete a; return ;
}

char型字符串(数组)与string型字符串 指针与引用

深复制:(被复制对象的变量与复制对象的变量拥有各自独有的内存空间)

#include <stdafx.h>
#include<iostream>
using namespace std;
class A
{
private:
int *x;
public:
A(){x=new int;*x=;}
~A(){delete x;x=;}
A (const A&temp){x=new int;*x=*(temp.x);}
void display(){cout<<*x<<"\t"<<&x<<endl;}
void set(int i){*x=i;}
};
int main()
{
A *a=new A;
a->display(); A b(*a);
b.display(); a->set();
a->display();
b.display(); b.set();
a->display();
b.display(); delete a; return ;
}

char型字符串(数组)与string型字符串 指针与引用

十、char型字符串(数组)与string型字符串

如:char man[100];//当使用cin来输入字符串时,遇到空格(即空字符0 or ‘\0’)的话,字符串输出时就从此截断。

比如输入hello world,那么输出只有hello。

C++提供了一种简单高效的方法来解决上述问题,char man[]={“hello world”},或者char man[]="hello world",此时再输出就正常了。

char型字符串时C语言时的风格,在C++时代产生了C++风格的字符串,string型字符串。使用时必须添加string头文件。

由于string是一个类,那么string str;//str就可以看成是string类的一个对象,该对象可以调用string类的各种成员函数。

1、char型字符串有以下3种形式

char c[12]="study"    //字符数组

“study”                    //未命名字符串

char *p="study"        //指向未命名字符串的指针

以上3种类型只有第一种所指向的字符串可以改变。

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std; char *get(char *str); int main()
{
char name[];
char *name1;
cout<<"请输入您的名字:"<<endl;
cin>>name;
name1=get(name);
cout<<"您的名字是:"<<name1<<endl;
delete []name1;
name1=get("Jack");
cout<<"您的名字是:"<<name1<<endl;
delete []name1;
char *name2="Mike";
name1=get(name2);
cout<<"您的名字是:"<<name1<<endl;
delete []name1;
return ;
}
char *get(char *str)
{
char *p=new char[strlen(str)+]; //这里如果用sizeof函数,程序会崩溃
strcpy(p,str);
cout<<p<<endl;
return p;
}

2、C的结构体与C++的类的唯一区别在于前者的成员变量默认是公有的,而类的成员变量默认是私有的。

对于公有成员变量,我们可以像使用成员函数那样使用成员变量。

char型字符串(数组)与string型字符串 指针与引用的更多相关文章

  1. C&num;中如何排除&sol;过滤&sol;清空&sol;删除掉字符串数组中的空字符串

    C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...

  2. 使用C&num;删除一个字符串数组中的空字符串

    C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...

  3. 07&period;C&num;中如何排除&sol;过滤&sol;清空&sol;删除掉字符串数组中的空字符串

    方式一:使用lambda表达式筛选过滤掉数组中空字符串         1 /// <summary> /// 使用lambda表达式排除/过滤/清空/删除掉字符串数组中的空字符串 /// ...

  4. 数组转集合、集合转数组、字符串数组与int型、long型数组等的转换

    在项目中经常会遇到数组转集合.集合转数组.数组之间类型转换等操作 1.数组转集合 为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码: String str[] = { ...

  5. JS怎么把字符串数组转换成整型数组

    今天在学习highcharts时,遇到了一个把字符串数组转换为整形数组的问题,拿在这里讨论一下: 比如有一个字符串: var dataStr="1,2,3,4,5"; 现在需要把它 ...

  6. 字符串数组 输入3个字符串,要求按由小到大的字母顺序输出&semi; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人

    输入3个字符串,要求按由小到大的字母顺序输出 如 输入franch england china,输出结果是china england franch 三个数排序输出,比较三个数的大小怎么做? a=18 ...

  7. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  8. 动态创建二维vector数组 C和C&plus;&plus; 及指针与引用的区别

    二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二 ...

  9. &lbrack;java变量&rsqb; - 字符串数组转long型数组

    //定义字符串 String str = "1,3,6,9,4,2,1,6"; //截取字符串 String[] strArr = str.split(",") ...

  10. 在Python中,如何将一个字符串数组转换成整型数组

    https://blog.csdn.net/xiangchengguan/article/details/78987041 arr = ['] arr = list(map(int,arr)) pri ...

随机推荐

  1. MySQL ALTER命令

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 开始本文教程前让我们先创建一张表,表名为:testalter_tbl. root@host# mysql -u r ...

  2. 【液晶模块系列基础视频】4&period;5&period;X-GUI图形界面库-进度条等函数简介

    [液晶模块系列基础视频]4.5.X-GUI图形界面库-进度条等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...

  3. sysctl&period;conf

    linux系统接口 允许改变正在运作linux系统接口Tcp/IP堆栈和虚拟内存系统的高级选项 用来控制Linux网络配置/proc/sys/net/core/ TCP/IP参数修改添加到/etc/s ...

  4. MVC描述对象的类关系图&sol;调用关系图【学习笔记】

  5. python中字母与ascii码的相互转换

    在做python编程时,碰到了需要将字母转换成ascii码的,原本以为用Int()就可以直接将字符串转换成整形了,可是int()带了一个默认参数,base=10,这里表示的是十进制,若出现字母,则会报 ...

  6. &lpar;详细&rpar;华为畅享7 SLA-AL00的usb调试模式在哪里打开的流程

    就在我们使用Pc链上安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则不能够成功检测到我们的手机,有时我们使用的一些功能比较好的的应用软件如之前我们使用的一个应用软件引号精灵,老版本就需要打 ...

  7. すぬけ君の塗り絵 &sol; Snuke&&num;39&semi;s Coloring AtCoder - 2068 (思维,排序,贡献)

    Problem Statement We have a grid with H rows and W columns. At first, all cells were painted white. ...

  8. node代理服务器

    var express = require('express');var request = require('request');var app = express();var _URL = 'ht ...

  9. cf——Sasha and a Bit of Relax(dp,math)

    关于异或运算,是可以求前缀和的.还有一些异或运算的性质 0^a=a; 交换律 a^b=b^a 结合律 a^(b^c)=(a^b)^c 分配率 a^(b+c)=a^b+a^c 自反律 a^b^b=a 判 ...

  10. QQ检测登陆及QQ协议

    QQ协议分析及还原 http://blog.csdn.net/qinggebuyao/article/details/7814499 腾讯的网站如何检测到你的 QQ 已经登录? http://blog ...