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函式 給結構體中的指標變數成員賦值時,要先給指標分...