復合資料型別(指標和引用)

2021-10-04 19:26:37 字數 4365 閱讀 4740

1.使用指標

2.動態儲存空間管理

3.引用型別

4.const限定指標

5.陣列與指標

6.總結

定義指標時,應該對指標進行初始化

指標的運算

同型別的指標可以進行相等(==)或不相等(!=)的比較操作,比較的結果是布林型別

指標可以進行加或減整數值的算術運算

自增、自減運算適用於指向陣列元素的.

通用指標void*

可以持有任何型別的位址值,即通用指標

相關的值是個位址,但是該位址儲存的物件型別不知道

不能操縱void指標指向的物件,只能傳送該位址值或者和其他位址值進行比較

不允許void指標到其他型別指標的直接賦值

指標的典型用法包括:

構建鏈式的資料結構,如鍊表和樹;

管理程式執行時動態分配的物件;

作為函式的引數。

堆(heap)、自由儲存區、動態儲存區

系統為所有程式提供了乙個執行時可用的記憶體池,這個記憶體池被稱為程式的自由儲存區或堆

動態記憶體管理方法

c++通過new和delete運算子進行動態儲存空間的管理

new運算子

在堆上動態分配空間,建立物件,並返回物件的位址

一般將new返回的位址儲存在指標變數中,以便間接訪問堆上的物件。

new表示式的三種形式

分配單個物件:new 型別 或者 new 型別(初始值)

分配多個連續儲存的物件:new 型別[陣列大小]

定位new,在指定位置分配空間:new (指標) 型別;

.第三個注釋:

new (指標) 型別;

定位new在指標指向的空間中建立乙個指定型別的物件

程式設計師可以預先分配大量的記憶體,以後通過定位new表示式在這段記憶體中建立物件

使用定位new,必須包含標準庫標頭檔案

#include

char

* buf =

newchar

[1000];

//預分配一段空間,首位址在buf中儲存

intmain()

空懸指標:
執行delete運算後,指標ip指向的空間被釋放,不能再使用ip指向的記憶體,但是ip這個指標變數自己的儲存空間不受影響

delete後的ip不是空指標,而是「空懸指標」,即指向不確定的單元

delete之後,繼續通過ip間接使用這個單元是非法的,會引起不可預料的執行錯誤

引用又稱為別名,它可以作為物件的另乙個名字;

通過引用可以間接地操縱物件;

在程式中,引用主要用作函式的引數。

一般在初始化變數時,初始值會被複製到新建的物件中

定義引用時,程式把引用和它的初始值繫結在一起,而不是將初始值拷貝給引用

一旦初始化完成,引用將和它的初始值物件一直繫結在一起

因為無法令引用重新繫結到另外乙個物件,所以引用必須初始化

指標與引用:

指標儲存指定型別的物件的位址,乙個指標可以指向同型別的不同物件

引用在初始化之後,一直指向該物件

指標通過解引用(*)運算間接訪問指向的物件

引用作為物件的別名,可以直接訪問物件

指標可以不指向任何物件,其值為0,表示空指標(有空指標)

引用必須指向乙個物件,而且一直指向該物件,不存在「空」引用。(沒有空引用)

賦值:

指標之間的相互賦值會改變指向關係

引用之間的相互賦值是它們指向的物件之間的賦值,引用關係本身並不改變

指向const物件的指標

const

int ival =

1024

;int

*pi =

&ival;

const

int ival =

1024

;const

int*pi =

&ival;

//ok

//或者這樣寫:

intconst

*pi =

&ival;

//ok

*pi =

500;

//錯誤:因為*pi是乙個const int

**c++允許將乙個非const位址賦值給const指標

int ival =

1024

;const

int*pi =

&ival;

ival =

500;

//ok,ival沒有被限定為const,可以改變

*pi =

500;

//錯誤: 不可以通過pi改變ival,因為pi是const int*

指向非const物件的const指標
int ival =

1024

;int

*const pi =

&ival;

pi所在記憶體中的值不能改變(pi=&ival)

pi指向的記憶體中的內容可以變(ival=1024;)

指向const物件的const指標

const

int ival =5;

const

int*

const pi =

&ival;

//pi是乙個指向const物件的const指標

const限定引用
const

int ival =5;

const

int&r1 = ival;

//正確:引用和所引用的物件都是const int

r1 =10;

//錯誤:r1是const的引用,不能修改

int&r2 = ival;

//錯誤:不能用非const引用指向const物件

使用陣列時一般會轉換為指標

ia是乙個int*型別的指標常量

ia和&ia[0]都表示陣列第乙個元素的位址

int ia[5]

;

int a[10]

;//指標訪問陣列元素

for(

int*p = a; p < a+

10; p++

) cout <<

*p;

陣列元素和位址

一維陣列元素在記憶體中按下標順序依次存放

一維陣列a[n]的元素a[i]在記憶體中位址是a+i。

多維陣列在記憶體中按行序儲存

二維陣列a[m][n]的元素a[i][j] 在記憶體中的位址是a+(i*n+j)

庫函式begin()和end()

讓指標在陣列上的使用更簡單更安全

在標頭檔案中定義

用法

begin(陣列名):返回指向陣列第乙個元素的指標

通過這一節內容,更加深刻了解到指標和引用的一些應用。對於指標,說難也難因為有時它很繞,說不難也不難因為有時它用的很方便。但const限定指標這一節,比較難以理解,因而需要深刻反思。動態儲存空間管理,new和delete的基本用法是不可缺少的。

復合資料型別

復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...

復合資料型別

一 struct結構體 封裝資料 存放多種不同的資料型別 struct的宣告放在全域性區 1.宣告和定義 宣告 struct student struct student stu array 3 int i for i 0 i 3 i for i 0 i 3 i include struct stu...

復合資料型別

結構體 作用 封裝資料 把多種不同的資料型別放在一起 注意 一般放在全域性 分號不能省略。結構體變數用點訪問 結構體指標用 訪問 初始化 靜態初始化 動態初始化 使用注意事項 給結構體中的陣列成員賦值時,不能直接將字串賦給陣列名,可以使用strcpy函式 給結構體中的指標變數成員賦值時,要先給指標分...