二維數組作為函數的參數問題
#include<iostream> using namespace std; void print(int n,int a[][10]){//形參a是一個n行二維數組的首地址 for(int i=0;i<n;i++){ for(int j=0;j<10;j++){ cout<<a[i][j]<<" "; } cout<<endl; } } int main(){ int k[3][10]={{0,1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9,10}, {2,3,4,5,6,7,8,9,10,11}}; print(3,k);//傳入二維數組的首地址 }
//另外函數定義時也可以這樣定義 void print(int n,int *a[10]),代表a是一個指向二維數組的指針
和一維數組作為函數的參數一樣,遵循的原則是形參的格式和實參的格式相同,形參是二維數組的首地址,則調用函數的時候傳入函數的也是二維數組的首地址。
關於指針的一些細節
const int * point 和int * const point 的區別
const int * point 可以按照“斷句”的方法來看 ( (const int) * point )指的是指向const int (int常量)的指針
int * const point 同樣,“斷句”為( (int * ) (const point ) )聲明的是一個指向int型變量的const 指針,即常指針
綜上,const貌似總是“修飾”緊跟其后的名稱
空類型指針
一般的指針都會聲明指針的類型,或是int型,或是char型,然而有一種特殊的void類型指針
void類型指針可以存儲任意類型的數據地址,通過顯示的轉換,可以通過指針訪問任意類型的數據
#include<iostream> using namespace std; int main(){ void * p; int a=100; char b='A'; string c="hello world"; /* p是一個可以指向任何數據類型的指針,但是p不可以直接使用,因為這樣非常不安全 在C++中,指針必須要進行顯式的轉化成特定類型的指針才可以使用 這里使用static_cast<typename * >來轉換,然后訪問特定的內容 */ p=&a; cout<<* static_cast<int * >(p)<<endl; p=&b; cout<<* static_cast<char * >(p)<<endl; p=&c; cout<<* static_cast<string * >(p)<<endl; }
空指針
空指針(區別於空類型指針)可以通過0或者NULL來初始化,NULL在很多頭文件中都會有宏定義,定義成0
指針數組和二維數組
#include<iostream> using namespace std; int main(){ //指針數組存儲的是地址,而存儲地址的變量和所有的變量一樣,需要開辟內存空間 int line1[]={0,1,2,3,4,5,6,7,8,9}; int line2[]={9,8,7,6,5,4,3,2,1,0}; int line3[]={1,3,5,7,9,0,8,6,4,2}; int *point[3]={line1,line2,line3}; //(int * ) point [3] for(int i=0;i<3;i++){ for(int j=0;j<10;j++){ cout<<point[i][j]<<" "; } cout<<endl; } }
point [ i ] [ j ]的語法格式和二維數組訪問的格式完全相同,但是二者實質上有着明顯的差異
#include<iostream> using namespace std; int main(){ int a[3][10]={{0,1,2,3,4,5,6,7,8,9},{9,8,7,6,5,4,3,2,1,0},{1,3,5,7,9,0,8,6,4,2}}; for(int i=0;i<3;i++){ for(int j=0;j<10;j++){ cout<<a[i][j]<<" "; } cout<<endl; } }
兩種語法都使用了二維數組的訪問方式,但是實質上訪問的過程完全不同
指向函數的指針
聲明指向函數的指針語法
數據類型 ( * 函數指針名)(形參表)
有時候多次定義同一個類型的指向函數的指針會很繁瑣,這個時候可以使用typedef來定義
typedef int (* function)(double); function a;//function此時成為了一個類型名 function b; ……………… int (* function)(double) ……………… int a(double b){ …… } funtion=a; double c=9.001; function(c);//這個時候,function是具體的指向函數的指針
動態內存分配
動態內存分配的初始化
1.不初始化 int *point = new int ;
2.0初始化 int * point = new int ( );
3. 指定初始化 int * point =new int (1);
對於對象,0初始化和不初始化的效果是一樣的,都是使用默認的構造函數。也許可以把0初始化看作是系統指定變量對應的構造函數?
動態分配數組
在釋放用new建立的數組的時候,需要使用 delete [ ]指針名來釋放數組空間