程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++靜態分派和撤消內存和構造體類型作為函數參數

C++靜態分派和撤消內存和構造體類型作為函數參數

編輯:關於C++

C++靜態分派和撤消內存和構造體類型作為函數參數。本站提示廣大學習愛好者:(C++靜態分派和撤消內存和構造體類型作為函數參數)文章只能為提供參考,不一定能成為您想要的結果。以下是C++靜態分派和撤消內存和構造體類型作為函數參數正文


C++靜態分派內存(new)和撤消內存(delete)
在軟件開辟進程中,經常須要靜態地分派和撤消內存空間,例如對靜態鏈表中結點的拔出與刪除。在C說話中是應用庫函數malloc和free來分派和撤消內存空間的。C++供給了較輕便而功效較強的運算符new和delete來代替malloc和free函數。

留意: new和delete是運算符,不是函數,是以履行效力高。

固然為了與C說話兼容,C++仍保存malloc和free函數,但建議用戶不消malloc和free函數,而用new和delete運算符。new運算符的例子:

new int; //開拓一個寄存整數的存儲空間,前往一個指向該存儲空間的地址(即指針)
new int(100); //開拓一個寄存整數的空間,並指定該整數的初值為100,前往一個指向該存儲空間的地址
new char[10]; //開拓一個寄存字符數組(包含10個元素)的空間,前往首元素的地址
new int[5][4]; //開拓一個寄存二維整型數組(年夜小為5*4)的空間,前往首元素的地址
float *p=new float (3.14159); //開拓一個寄存單精度數的空間,並指定該實數的初值為//3.14159,將前往的該空間的地址賦給指針變量p

new運算符應用的普通格局為:

  new 類型 [初值];

用new分派數組空間時不克不及指定初值。假如因為內存缺乏等緣由而沒法正常分派空間,則new會前往一個空指針NULL,用戶可以依據該指針的值斷定分派空間能否勝利。

delete運算符應用的普通格局為:

  delete [ ] 指針變量

例如要撤消下面用new開拓的寄存單精度數的空間(下面第例,應當用

  delete p;


後面用“new char[10];”開拓的字符數組空間,假如把new前往的指針賦給了指針變量pt,則應當用以下情勢的delete運算符撤消該空間:

  delete [] pt; //在指針變量後面加一對方括號,表現是對數組空間的操作

【例】開拓空間以寄存一個構造體變量。

#include <iostream>
#include <string>   
using namespace std;
struct Student //聲明構造體類型Student
{
  string name;
  int num;
  char sex;
};
int main( )
{
  Student *p; //界說指向構造體類型Student的數據的指針變量
  p=new Student; //用new運算符開拓一個寄存Student型數據的空間
  p->name="Wang Fun"; //向構造體變量的成員賦值
  p->num=10123;
  p->sex='m';
  cout<<p->name<<endl<<p->num
  <<endl<<p->sex<<endl; //輸入各成員的值
  delete p; //撤消該空間
  return 0;
}

運轉成果為:

Wang Fun 10123 m

圖為new student開拓的空間。

在靜態分派/撤消空間時,常常將這兩個運算符和構造體聯合應用,是很有用的。可以看到:
要拜訪用new所開拓的構造體空間,沒法直接經由過程變量名停止,只能經由過程指針p停止拜訪。假如要樹立一個靜態鏈表,必需從第一個結點開端,逐一地開拓結點並輸出各結點數據,經由過程指針樹立起前後相鏈的關系。

C++構造體類型作為函數參數
將一個構造體變量中的數據傳遞給另外一個函數,有以下3種辦法:
用構造體變量名作參數。普通較罕用這類辦法。
用指向構造體變量的指針作實參,將構造體變量的地址傳給形參。
用構造體變量的援用變量作函數參數。

上面經由過程一個簡略的例子來講明,並對它們停止比擬。

【例】有一個構造體變量stu,內含先生學號、姓名和3門課的成就。請求在main函數中為各成員賦值,在另外一函數print中將它們的值輸入。

1) 用構造體變量作函數參數。

#include <iostream>
#include <string>
using namespace std;
struct Student//聲明構造體類型Student
{
  int num;
  char name[20];
  float score[3];
};
int main( )
{
  void print(Student); //函數聲明,形參類型為構造體Student
  Student stu; //界說構造體變量
  stu.num=12345; //以下5行對構造體變量各成員賦值
  stu.name="Li Fung";
  stu.score[0]=67.5;
  stu.score[1]=89;
  stu.score[2]=78.5;
  print(stu); //挪用print函數,輸入stu各成員的值
  return 0;
}
void print(Student st)
{
  cout<<st.num<<" "<<st.name<<" "<<st.score[0]
  <<" " <<st.score[1]<<" "<<st.score[2]<<endl;
}

運轉成果為:

12345 Li Fung 67.5 89 78.5 (2)

2)用指向構造體變量的指針作實參在下面法式的基本上稍作修正便可。

#include <iostream>
#include <string>
using namespace std;
struct Student
{
  int num; string name; //用string類型界說字符串變量
  float score[3];
}stu={12345,"Li Fung",67.5,89,78.5}; //界說構造體student變量stu並賦初值
int main( )
{
  void print(Student *); //函數聲明,形參為指向Student類型數據的指針變量
  Student *pt=&stu; //界說基類型為Student的指針變量pt,並指向stu
  print(pt); //實參為指向Student類數據的指針變量
  return 0;
}
//界說函數,形參p是基類型為Student的指針變量
void print(Student *p)
{
  cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" " <<
  p->score[1]<<" "<<p->score[2]<<endl;
}

挪用print函數時,實參指針變量pt將stu的肇端地址傳送給形參p(p也是基類型為student的指針變量)。如許形參p也就指向stu,見圖。

在print函數中輸入p所指向的構造體變量的各個成員值,它們也就是stu的成員值。在main函數中也能夠不界說指針變量pt,而在挪用print函數時以&stu作為實參,把stu的肇端地址傳給實參p。

3) 用構造體變量的援用作函數參數

#include <iostream>
#include <string>
using namespace std;
struct Student
{
  int num;
  string name;
  float score[3];
}stu={12345,"Li Li",67.5,89,78.5};
int main( )
{
  void print(Student &);
  //函數聲明,形參為Student類型變量的援用
  print(stu);
  //實參為構造體Student變量
  return 0;
}
//函數界說,形參為構造體Student變量的援用
void print(Student &stud)
{
  cout<<stud.num<<" "<<stud.name<<" "<<stud.score[0]
  <<" " <<stud.score[1]<<" "<<stud.score[2]<<endl;
}

法式(1)用構造體變量作實參和形參,法式直不雅易懂,效力是不高的。
法式(2)采取指針變量作為實參和形參,空間和時光的開支都很小,效力較高。但法式(2)不如法式(1)那樣直接。
法式(3)的實參是構造體Student類型變量,而形參用Student類型的援用,真假聯合時傳遞的是stu的地址,因此效力較高。它兼有(1)和(2)的長處。

援用變量重要用作函數參數,它可以進步效力,並且堅持法式優越的可讀性。在本例頂用了string辦法界說字符串變量,在某些C++體系中今朝不克不及運轉這些法式,讀者可以修正法式,使之能在本身所用的體系中運轉。

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