一、常指针:

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;

程序输出结果:

所以,为了保证程序的安全可靠,需要在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 ;
}

//运行结果如下图所示

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

临时变量生存期的问题

#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;
}

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

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

此时函数按值返回,对象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 ;
}

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

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

#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必须注释掉否则程序会崩溃。)

九、复制构造函数

#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 ;
}

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

#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 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#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

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

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

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

  3. 07.C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

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

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

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

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

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

  6. 字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入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++ 及指针与引用的区别

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

  9. [java变量] - 字符串数组转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. 用happen-before规则重新审视DCL(转载)

    编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...

  2. Java获取 JVM 运行信息

    import java.lang.management.ClassLoadingMXBean; import java.lang.management.ManagementFactory; impor ...

  3. 【转】MySQL数据库主从同步管理

    MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙 ...

  4. ReentrantLock和synchronized的区别

    一.ReentrantLock类 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性 ...

  5. monkey与monkeyrunner的使用

    什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压 ...

  6. EF架构~过滤导航属性等,拼接SQL字符串

    拼接T-SQL串,并使它具有通用性 好处:与服务器建立一次连接,给服务器发一条SQL命令,即可实现 代码如下: 1 /// <summary> 2 /// 构建Insert语句串 3 // ...

  7. cocos2d-x实战 C++卷 学习笔记--第4章 使用标签

    前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出 ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 4)

    12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1  2  3   4   5 2  4  6   8   10 3  6  9   12 ...

  9. 使用FOR循环语句在屏幕上输出一个由星号组成的直角三角形

    题目要求: 请用C++的信息输出方式,使用循环语句在屏幕上输出一个由星号组成的直角三角形,形状如下: * ** *** **** ***** 要求: 完全使用C++的信息输出方式,即cout以及流插入 ...

  10. java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

    /* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...