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次。