C++數組、指針、動態內存分配


二維數組作為函數的參數問題

#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 [ ]指針名來釋放數組空間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM