目錄
一、記憶體是什么?
1.1、記憶體
1.2、變數地址;
二、指標
2.1、夏日
2.2、指標
2.3、*July_num與July_num;
2.4、指標的賦值與型別
2.5、陣列名也是一種特殊的指標?!!
2.6、指標的指標——二級指標;
三、尾聲
一、記憶體是什么?
1.1、記憶體
記憶體就是計算機內部的儲存空間(廢話文學??),類比于你的書架,你的錢包,你家的倉庫等等,它們用于儲存你放的東西;
記憶體包括記憶體地址和儲存空間;就像你去圖書館,要查找書的地址(記憶體地址),再通過書的地址找到書在哪兒,再看書(訪問內容);
(來看靈魂畫手!)
我們來定義一個整型變數int c=999;
計算機會這么分配記憶體空間:

(老子早晚要搞臺IPAD來學畫畫,,,)
1.2、變數地址;
你看,我們知道了c的地址被儲存在1的位置(真實的地址都是形如0161FD51一樣的,這里只是形象地說明所以我們采用了1的說法);1就是起始地址;那么,我們怎么拿到變數c的地址呢?
你一定想到了吧!我們使用取值符“&”來獲取變數地址!請看:
#include<bits/stdc++.h>
using namespace std;
int main(){
int c=999;
cout<<"c: "<<c<<endl;//輸出c的值
cout<<"&c: "<<&c<<endl;//輸出c的地址
}
&c就是變數地址,也就是我們要找的“書的位置”;
二、指標
2.1、夏日
那年夏夜我們在83-Lounge喝金湯力和椰林飄香,杜松子的氣味很清,就像你身上的潘海利根琴酒;你好奇我一個小孩子怎么會來這里,我好奇你為什么來逗一個小孩子開心;我記得你跟我開的玩笑,男孩子該試試馬天尼,敢試我就給你份驚喜;
小孩子那么倔怎么會拒絕?小孩子怎么會承認自己是小孩子?
于是我暈乎乎地拿到人生中第一張寫有電話號碼的紙條;
或者說,一根獨特的指標,指向一個我不清楚的值;
沒錯親愛的朋友們,那張紙條就是個指標,我可以借助這個指標(這張寫有電話號碼的紙條)來找到那個姐姐(變數),
那么C++中的指標呢?
2.2、指標
接下來我們將宣告一個指標變數,它將指向一個整形變數;
請看:
#include<bits/stdc++.h>
using namespace std;
int main(){
int July=166;
int *July_num = &July; //July_num為指標,它的值是July的地址;
}
然后再看看靈魂畫手!

是的,您可以看到,July_num是個整形指標變數,它指向的是整形變數July的起始地址1(哈哈哈當然真實的地址不是這樣的啦,真實的地址是0x71fe00這樣的形式,只是方便理解我寫成了1喔);
對于 int *July_num = &July; 它是把July的地址1賦給了指標July_num;
讓我們看看輸出吧!
#include<bits/stdc++.h>
using namespace std;
int main(){
int July=166;
int *July_num = &July; //July_num為指標,它的值是July的地址;
cout<<"July_num = "<<July_num<<endl;
}
July_num便是那張寫有電話號碼的紙條!(記錄了July的地址1)
而July就是那位漂亮姐姐!!(可以通過修改*July_num的值來修改July的值,我們稍后再講)
簡而言之就是,
*指標是一種值為地址變數,存的是記憶體的地址編號,
2.3、*July_num與July_num;
兩者并不是一回事!!
請看:
#include<bits/stdc++.h>
using namespace std;
int main(){
int July=166;
int *July_num = &July; //July_num為指標,它的值是July的地址;
cout<<"July_num = "<<July_num<<endl;
cout<<"*July_num = "<<*July_num<<endl;
*July_num=199; //如您修改*July_num,July亦會一并修改;
cout<<"July = "<<July<<endl;
}
您可以看到July_num的值是一個地址,而 *July_num是一個值;
而通過指標修改的值會一并修改原來的值;
2.4、指標的賦值與型別
您看,July_num就是一種指標,而賦值的型別必須是相同的,您不能把一個數字賦給一個地址對吧,所以形如 July_num = 999 是錯誤的,正確的賦值是使用取址符&,即
July_num = &July;
除此之外,您可以定義其他型別指標如下;
#include<bits/stdc++.h>
using namespace std;
class Sum_mi {
public:
char Name;
int Hight=160;
int Weight=55;
}; //定義類為 Sum_mi;
int main(){
double* Judy_num;//指向double型別的指標
char* Angel_num;//指向char型別的指標
bool* Annie_num;//指向bool型別的指標
Sum_mi* Sum_mi_num;//指向類或者結構體型別的指標;
int** Badguy_num; //指向 int*的指標,也稱二級指標;
}
需要特別提到的是空指標和void指標;
空指標:不指向任何東西的指標,可以賦予一個整形的0給指標,使其變成空指標,也可賦值NULL使其變成空指標;如:
#include<bits/stdc++.h>
using namespace std;
int main(){
if(NULL==0)cout<<"yes"<<endl;
char* P_NULL1=0;
char* P_NULL2=NULL;
cout<<"* P_NULL1 = "<<* P_NULL1<<"yes"<<endl;//如果是它們是空指標,那么這兩句話不會被執行;
cout<<"* P_NULL2 = "<<* P_NULL2<<"yes"<<endl;//您可以以此檢驗指標是否為空指標;
}
void*指標:可以接受任何型別的地址;
請看:
#include<bits/stdc++.h>
using namespace std;
int main(){
char Sum_mi='J';
char *Sum_mi_p = &Sum_mi;//普通指標必須嚴格對應類形;
//char指標只能接受 char的變數;
void* Sum_mi_p1 = &Sum_mi;//void指標可以接受任何型別;
cout<<"Sum_mi_p"<<Sum_mi_p<<endl
cout<<"Sum_mi_p1"<<Sum_mi_p1<<endl;//可以看出來它們均能輸出;
}
2.5、陣列名也是一種特殊的指標?!!
還真是,,,,,,請看:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
//陣列名稱本來就是一種指標;
for(int i=0;i<5;i++)
{
cout<<a+i<<endl;
}
//您將看到陣列a的每一個元素的地址;
for(int i=0;i<5;i++)
{
cout<<*(a+i)<<endl;
}
//您將看到陣列每一個元素的值;
}
2.6、指標的指標——二級指標;
指標當然也可以指向指標!
指標當然也可以指向 指向指標的指標!
指標當然也可以指向 指向的指向指標的指標!
(我不喜歡套娃但是經常得跟套娃打交道,,,嗚庫魯西,,,)
#include<bits/stdc++.h>
using namespace std;
int main(){
int c=999; // 定義整形變數c,值為999
int* pc=&c; //定義整形指標pc指向c,指標型變數的儲存物件為地址; &c為獲取c的地址;
cout<<pc<<endl; //輸出指標pc的值,也就是c的地址;
cout<<*pc<<endl;//輸出指標pc所指向的c的值;可以對其進行運算操作等等,會直接改變c的值;
*pc-=999; //對*pc進行操作;
cout<<*pc<<" "<<pc<<" "<<c<<endl; //通過指標pc對c進行操作,進而傳遞值;注意,c的值會改變,但是pc的值,也就是c的地址不會改變;
int **ppc=&pc; //指標當然可以指向指標;此為二級指標;
cout<<ppc<<" "<<*ppc<<" "<<**ppc;
//輸出二級指標ppc的地址;
//輸出二級指標*ppc指向一級指標*pc的地址;
//輸出二級指標ppc最終指向的值;
}
}
三、尾聲
感謝您的閱讀!
筆者只是一名普通的大學生,因此行文與觀點多有不成熟之處,
受限于筆者的水平,本文并不包括陣列與指標的講解;
如果您有獨特的觀點與想法,歡迎與我討論,還望您不吝賜教,我將十分感激;
如本文有疑似侵犯著作權的問題,請與筆者速速聯系!
您可以給我留言,(雖然我懷疑沒什么人看?)看到我會盡快回復;
本文不含例題(就是筆者是個賤人他懶得找所以放在下次一并講了哈哈哈)
下一篇文章將講解鏈表,使用acwing的題目作為例題講解;
特別鳴謝Hasmokan,
Krito,AC-47亦對本文有指導,
夏日彌死傲嬌
于2021.11.14
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357174.html
標籤:其他
上一篇:第四章:分支結構程式設計
下一篇:2021-11-14
