好一個指標
- 說明
- 指標是個啥
- 各種指標
- 陣列與指標
- 一維陣列
- 多維陣列
- 字串與指標
- 多級指標與指標陣列
- const指標
- const型別名前
- const在指標名前
- 堆記憶體分配
- 函式指標
說明
大一咸魚一只,閑來無趣,隨意寫寫
指標是個啥
指標是一種特殊的變數,和整型、浮點型、字符型等相似,只不過前者存的是地址,后者存的是數、是字符(其實歸根結底存的都是一串二進制碼),
因為指標是存盤地址的變數,所以指標名表示的就是一個地址(就好比 int a; 中 a 表示的是一個整型數一樣),
- 先談談地址 ,地址計算機存盤變數的記憶體單元(常被比喻成房間號),你可以通過地址運算子(&)來對一個變數進行取地址操作;
- 再談談指標,指標存的是一個變數的地址,并指向此變數,假設p是一個指標,*p就表示該地址記憶體的值即指標所指向的變數的值,注意&p表示的也是一個地址,即p這個指標的地址,看一段程式:
#include <iostream>
using namespace std;
int main(void){
int a(7); //定義一個整型數
int *p;
//定義一個可指向整型的指標,在C++中 int* 是一種復合型別,是指向int的指標
p = &a; //把a的地址存入指標
cout<<"p = "<<p<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"a = "<<a<<endl;
cout<<"&p = "<<&p<<endl;//取指標p的地址
}
輸出
p = 0x7ffeefbff48c
&a = 0x7ffeefbff48c
*p = 7
a = 7
&p = 0x7ffeefbff480
Program ended with exit code: 0
- 因為地址與系統有關,32位系統中指標變數占4個位元組,64位系統中指標占8個位元組,
- 指標不是整型,雖然指標存放的地址是一個整數,但其型別不是整型,比如這樣:
int *p;
p = 0x7ffeefbff480;
報錯Assigning to 'int *' from incompatible type 'long'表示型別不匹配,
改正如下:
int *p;
p = (int*)0x7ffeefbff480;
- 指標的危險:在使用指標時,一定要給指標一個地址,
- 可以給指標加上一個整數,每加一,地址值加一個指標指向型別所占用的位元組數,也可以將兩個指標相減,得到一個整數(只在陣列中有意義),指標還可以進行關系運算,
各種指標
陣列與指標
一維陣列
對于一個陣列
int b[10]; //定義一個int陣列
cout<<b<<endl; //輸出&b[0],即陣列首地址
cout<<b+1<<endl; //輸出的數加4
cout<<&b<<endl; //輸出整個陣列的地址
cout<<&b+1<<endl; //輸出的數加4*10=40
輸出
0x7ffeefbff460
0x7ffeefbff464
0x7ffeefbff460
0x7ffeefbff488
Program ended with exit code: 0
注意b與&b的區分
int b[10]; //定義一個int陣列
int *p=b; //正確,int型指標指向陣列存放陣列首地址
p = &b; //錯誤,int型指標p不能存放整個陣列的地址
大多數時候陣列名與指向陣列的指標名可以混用,并且既可以使用陣列的( [] )表示法,也可以使用(*)運算子,即a[i]與*(a+i)等價,但是指標名可以修改(地址變數),陣列名不可修改(地址常量),此外,對陣列使用sizeof運算子得到陣列的長度,對指標使用則得到指標的長度,
int b[10];
int *p=b;
b += 1; //錯誤
p += 1; //正確
多維陣列
以二維陣列為例
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
cout<<a[2][3]<<endl;
cout<<*(a[2]+3)<<endl;
cout<<*(*(a+2)+3)<<endl;
輸出
12
12
12
Program ended with exit code: 0
二維陣列還可以使用行指標處理,定義形式:
型別名 (*指標名)[列長度]
int main(void){
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p1)[4], *p2;
p1=a; //正確,p1為一個行指標,與二維陣列名型別相同
p2=a; //錯誤,型別不匹配
字串與指標
char ch[80]="wonderland";
char *s1="wonderland1.0";
cout<<ch<<endl; //陣列名ch即是第一個元素'w'的地址,輸出ch即輸出整個字串
cout<<s1<<endl; //可以像使用字串那樣使用指標s1
輸出
wonderland
wonderland1.0
Program ended with exit code: 0
在cout和多數C++運算式中,char陣列名、char指標以及用引號括起來的字串常量都被解釋為字串的第一個字符的地址
多級指標與指標陣列
即指標的指標與放指標的陣列
char *a[]={"wonderland1.0","2.0","3.0"}; //放char型指標的指標陣列
char **p=a; //指標p存放的是char型指標的地址,初始化為指標陣列a的第一個元素
cout<<p<<endl;
cout<<*(p+1)<<endl;
cout<<**(p+1)<<endl;
cout<<*p+3<<endl;
輸出
0x7ffeefbff470
2.0
2
derland1.0
Program ended with exit code: 0
const指標
const型別名前
表示一個指向常量的指標
char *p1="Wonderland", *p2="1.0";
const char *p=p1; //表示宣告指向常量的指標
*p = 'F'; //錯,指標所指向的是常量,不能更改
p = p2; //正確,指標本身的值可以改變
const在指標名前
表示宣告一個指標常量
char *p1="Wonderland";
char *const p2="1.0"; //宣告指標常量,宣告常量時必須初始化
p2 = p1; //錯誤,指標本身不能更改
*p2 = '2'; //正確,指標指向的值可以改變
堆記憶體分配
需要在程式運行時分配空間的情況下使用,
兩個運算子,一個例子,
- 運算子:new 和 delete ,new用于申請空間,delete用于釋放空間,
- 例子
int *p, m;
cin>>m;
p = new int[m]; //動態分配記憶體單元
delete []p; //釋放所分配的記憶體
函式指標
與陣列類似,函式名也是一個代表函式入口的地址常量
宣告一個指向函式的指標即為函式指標,可以通過這個指標呼叫函式
由此可見,若宣告一個名為(*pf)的函式,那么pf就是函式指標了,
注意區分:*pf(int)意味著pf()是一個回傳指標的函式,(*pf)(int)意味著pf是一個指向函式的指標,(括號比*優先級高導致)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279988.html
標籤:其他
上一篇:mit6.S081小結
下一篇:羅斯—霍爾維茨判據
