一、指標的概念
指標是一種資料型別,被稱為"指標型別",指標型別描述的是一個地址,這個地址指向記憶體中另外一個物件的位置,簡單的說,指標表示的是它所指向物件的地址,這些地址包括變數,陣列或函式,
C++編譯系統在編譯時會為不同資料型別的物件分配大小不同的存盤空間,每個儲存空間都有一個固定的編號,根據這個地址即可準確找到并訪問這些儲存單元,
定義整數型變數:int a=5;----------->如何取到整數變數a的地址?
定義整數型指標變數:int* pInt=&a;

定義如下指標:char* p="hello";陣列記憶體分配結構如圖所示,此時指標變 量p存盤陣列的首地址,
指標和指標變數的區別
A、指標是一種新的資料型別,這種資料型別專門用來存盤記憶體地址,
B、XXX型指標是一種具體指標資料型別,用于描述相應資料型別的記憶體地址,
C、指標變數是一個變數,用于存放對應資料型別的地址值,只占用4個位元組的 大小,
相關運算子(&,*)理解
#include<iostream>
usingnamespacestd;
voidmain()
{inta=5,*p=&a;//*表示型別說明
cout<<*p<<endl;//*p表示所指向的變數a的值system("pause");}
二、指標的定義和賦值
指標的定義
使用指標變數前必須先宣告,
使用指標資料型別定義的變數,稱為指標變數,用符號*表示此變數是指標變數,
指標變數只能用來存放記憶體地址,
指標變數記憶體所占的大小是 4個位元組,
指標變數的定義如下三種形式(常用第一種形式)

int*ptr1=0;//定義int型指標變數ptr1char*ptr2=0;//定義char型指標變數ptr2int*ip1,ip2;//宣告了1個指標變數ip1和1個普通變數ip2int*ip3,*ip4;//宣告了兩個整數型指標變數ip3,ip4
一次定義多個指標變數,每個指標變數前必須加“”,否則,只有前面 加“”的才能被解釋成指標,
指標的賦值
任何一個指標變數,可以被賦值為空,即指標變數的值賦為0或NULL或nullptr; 指標變數的賦值運算有6種形式
(1)指標變數初始化賦值,如int* ptr1 = 0;,
(2)把一個變數的地址賦值給相同資料型別的指標變數(地址運算子&—>& 變數),
int*pa;inta;pa=&a;//把整型變數a的地址賦予整型指標變數pa
(3)把一個指標變數的值賦值給相同資料型別的另一個指標變數,
int*pa;inta;pa=&a;int*pb=pa;//把pa的地址賦予指標變數pbcout<<pa<<"\n"<<pb;
(4)把陣列的首地址賦值給指向陣列的指標變數,
inta[5];int*pa=a;//陣列名表示陣列的首地址,指標變數pa指向陣列首地址 pa=&a[0];
(5)把字串的首地址賦值給指向字符型別的指標變數,
constchar*pc;pc="c language";//把字串的首地址賦予指標變數 char *pc="c language";
(6)把函式的入口地址賦值給指向函式的指標變數,
int(*pf)();pf=f;//f為函式名
//示例,方便測驗理解#include<iostream>
usingnamespacestd;intf(inta){returna;};
intmain(){int(*pf)(int);pf=f;//f為函式名f(12);system("pause");}
舉例說明
在代碼欄輸入以下代碼,編譯查看輸出結果,注意查看兩個記憶體地址是否一樣:
#include<iostream>usingnamespacestd;voidmain(){inta=10;int*p=&a;cout<<&a<<endl;cout<<p<<endl;}
給指標變數賦值時需要注意:
(1)未經賦值的指標變數不能使用,
(2)指標變數的賦值只能賦予地址, 不能賦予任何其它資料,
三 指標的運算
未經賦值的指標變數不能使用,
指標只能進行賦值運算、間接參考運算、算術運算、兩個指標的相減運算和兩個 指標的比較運算
(1)賦值運算
取地址運算子& 和間接參考運算子解參考運算子 *
指標變數在使用之前必須有確定的指向,
NULL是一個指標常量,表示空地址,當指標變數暫時無法確定其指向或暫時不 用時,可以將它指向空地址,以保證程式的正常運行,
inta=0;int*ptr1=&a;
(2)間接參考運算
符號*也稱為間接參考運算子,其運算結果為該指標所指物件的值,
inta=16,b=28;int*pa=&a,*pb;//符號*表示pa、pb是指標變數a*=b;//符號*表示進行乘法運算 *pa=123;//符號*表示間接參考pa所指向的物件a
(3)算術運算
與整數的加減運算和自增、自減運算,指標變數存盤的是資料的記憶體地址, 因此可以將指標視為類似整型的變數,指標加上或減去一個整數,其結果是一個 新的地址值,
指標加上或減去一個整數n,表示指標從當前位置向后或向前移動n*sizeof< 資料型別>大小的地址空間,
inta=16;int*pa=&a;int*p1,*p2;p1=pa+3;p2=pa-2;//變數a分配的首地址是0066FDF4,則p1=&a+3*sizeof(int)= 0066FDF4+3*4=0066FE00,同理p2=&a-2*sizeof(int)=0066FDF4- 2*4=0066FDEC,
如下圖所示:

指標的自增或自減表示指標從當前位置向后或向前移動sizeof(資料型別) 大小的地址空間,

(4)兩指標相減
當兩個指標指向同一陣列時,兩個指標的相減才有意義,兩個指標相減的結 果是一個整數,表示兩個指標之間陣列元素的個數,
inta[10];int*p1=&a[1];//p1指向a[1] int*p2=&a[6];//p2指向a[6] intb=p2-p1;// b=5
如果你也想成為程式員,想要快速掌握編程,趕緊關注小編加入學習企鵝圈子吧!
里面有資深專業軟體開發工程師,在線解答你的所有疑惑~編程語言入門“so easy”
資料包含:編程入門、游戲編程、課程設計等,
免費學習書籍:

免費學習資料:

(5)兩個指標的比較運算
當兩個指標指向同一個陣列時,兩個指標比較大小才有意義, 兩指標變數可以進行關系運算,
#include<iostream>usingnamespacestd;//pf1 == pf2 表示pf1和pf2指向同一陣列元素; //pf1 > pf2 表示pf1處于高地址位置; //pf1 < pf2 表示pf1處于低地址位置,#include<iostream>usingnamespacestd;voidmain(){inta[10];int*p1=&a[1];//p1指向a[1]int*p2=&a[6];//p2指向a[6]if(p1==p2){cout<<"=="<<endl;}else{cout<<"!="<<endl;}system("pause");}
指標變數還可以與0比較,判斷指標是否為空指標,
p==0:表明p是空指標,表示它不指向任何變數;
p!=0:表示p不是空指標,
指標變數為0和指標變數未賦值是不同的概念,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249684.html
標籤:C
