程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中關於[]靜態數組和new分派的靜態數組的差別剖析

C++中關於[]靜態數組和new分派的靜態數組的差別剖析

編輯:關於C++

C++中關於[]靜態數組和new分派的靜態數組的差別剖析。本站提示廣大學習愛好者:(C++中關於[]靜態數組和new分派的靜態數組的差別剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中關於[]靜態數組和new分派的靜態數組的差別剖析正文


本文以實例剖析了C++說話中關於[]靜態數組和new分派的靜態數組的差別,可以贊助年夜家加深對C++說話數組的懂得。詳細差別以下:

1、對靜態數組名停止sizeof運算時,成果是全部數組占用空間的年夜小;
是以可以用sizeof(數組名)/sizeof(*數組名)來獲得數組的長度。
int a[5]; 則sizeof(a)=20,sizeof(*a)=4.由於全部數組共占20字節,首個元素(int型)占4字節。
int *a=new int[4];則sizeof(a)=sizeof(*a)=4,由於地址位數為4字節,int型也占4字節。

2、靜態數組作為函數參數時,在函數內對數組名停止sizeof運算,成果為4,由於此時數組名代表的指針即一個地址,占用4個字節的內存(由於在傳遞數組名的參數時,編譯器對數組的長度不做檢討,詳細可參考後面一篇c++對數組的援用實例剖析)。對靜態數組的函數名,不管什麼時候停止sizeof運算,獲得的成果都是4.

3、new還須要你delete,是在堆分派空間,效力較低;而[]直接在棧上分派,會主動釋放,效力高,然則棧空間無限。

4、經由過程函數前往一個數組的成績

函數聲明的靜態數組弗成能經由過程函數前往,由於生計期的成績,函數挪用完其外部變量占用的內存就被釋放了。假如想經由過程函數前往一個數組,可以在函數頂用new靜態創立該數組,然後前往其首地址。
其緣由可以如許懂得,由於[]靜態數組是在棧中請求的,而函數中的部分變量也是在棧中的,而new靜態數組是在堆中的分派的,所以函數前往後,棧中的器械被主動釋放,而堆中的器械假如沒有delete不會主動釋放。

例子以下:

int *test(int *b) //b可所以靜態數組的數組名,也能夠是靜態數組的首地址
{
  for(int i=0;i<5;i++) //輸入傳入的數組各元素
   cout<<*(b+i)<<" ";
  cout<<endl;
  int *c=new int[5]; //靜態創立一個數組
  //假如將綠色部門換為int c[5];則主函數中挪用test沒法獲得c數組
  for(i=0;i<5;i++)  //新數組的各項值等於傳入的數組各項值加5
   *(c+i)=*(b+i)+5;
  return c;     //前往新創立的靜態數組的首地址
}
int main()
{
 int *b=new int[5]; //創立靜態數組b
 for(int i=0;i<5;i++)//賦值
  *(b+i)=i; 
 //綠色部門也能夠換為int b[5]={0,1,2,3,4};即也能夠是靜態數組
 int *c=test(b);   //將b作為參數,挪用test函數,前往值賦給c
 for(i=0;i<5;i++)  //輸入test前往的數組的各項
   cout<<*(c+i)<<" ";
 cout<<endl;
 return 0;
}

信任看過本文實例剖析以後可以進一步加深讀者對C++數組的熟悉。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved