C++ 指针和数组【易错题】

1. 解引用操作

  • 检查下面代码的问题:
swap( int* p1,int* p2 )
{
	 int *p;
	 *p = *p1;
	 *p1 = *p2;
	 *p2 = *p;
}

问题:没有初始化指针p,不能对其进行解引用操作。

解引用操作仅适用于那些确实指向了某个对象的有效指针 --《C++ Primer》

改正:

swap( int* p1,int* p2 )
{
	 int p;
	 p = *p1;
	 *p1 = *p2;
	 *p2 = p;
}

2. 指针和const

  • 检查下面代码的问题:
const double pi = 3.14;
double *ptr = &pi

问题:不是指向常量的指针(普通指针)不能指向一个常量

改正:

const double pi = 3.14;
const double *ptr = &pi //底层const

const对象必须初始化!!const指针也一样!!

3. 指针和数组

数组定义方法:

int arr[10];//包含10个整数的数组,默认初始化
int *p[10];//包含10个整型指针的数组,默认初始化
//初始化
int a1[3]={1,2,3};
int a2[]={1,2,3};
int a3[5]={1,2,3};//剩余的默认初始化
int a4[3]={1,2,3,4};//错误,初始值过多
//字符数组
char a1[]={'C','+','+'};//无空字符
char a2[]={'C','+','+','\0'};//显式添加空字符
char a3[]="C++"; //隐式添加了空字符
cout<<sizeof(a1)<<endl;//3
cout<<sizeof(a2)<<endl;//4
cout<<sizeof(a3)<<endl;//4
char a4[6]="Daniel";//错误,没有空间存放空字符

数组名可以转换为指针常量

  • 容易出现的问题:
char a[]="C++";
a++;//错误,a是指针常量,不能++操作
  • 改正:
char a[]="C++";
char *p=a; //指针拷贝
p++;//普通指针可以++操作

什么情况下数组名会转换成指针?

  • 当直接对数组名进行sizeof()操作时,数组名不会转换成指针,sizeof()计算的就是数组的长度
char a3[]="C+++++"; //隐式添加了空字符
char a4[15]="C+++";//没有填满
cout<<sizeof(a3)<<endl;//7
cout<<sizeof(a4)<<endl;//15,而不是写入的字符串的长度
//如果要计算里面写入的字符串长度,使用strlen()
cout<<strlen(a4)<<endl;//4,不会将空字符计算在内
  • 当数组名作为形参传入函数时,会自动转化成一个指针:指针的大小为4字节
void Func (char str[100])
{
	cout<<sizeof(str)<<endl;//4,返回的是指针的大小
}

3. 二维数组定义

数组初始化必须制定列,可以不指定行

int b[][3]={0,1,2,3};//正确
int d[3][]={{1,2},{1,2,3},{1,2,3,4}};//错误

4. 指针的数组 (*p)[3]

  • 若PAT是一个类,则程序运行时,语句“PAT(*ad)[3];”调用PAT的构造函数的次数是( 0 )
  • pat (*obj)[3]; 定义三个指向pat类型object的指针,所以构造函数调用次数为0
  • 假如改为pat obj[3],则调用3次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章