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次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章