似乎大家在oi中都並不是很喜歡使用指標,因為這個東西關於玄學,還會莫名re
但是好多高手很喜歡用指標啊
如果您想學習指標的入門級使用方法,這篇文章可能比較適合你
筆者會把他在oi中使用指標的經驗都寫在這裡(筆者水平 普及<<31????)
在電腦科學中,指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為「指標」。意思是通過它能找到以它為位址的記憶體單元。[1] 在高階語言中,指標有效地取代了在低階語言,如組合語言與機器碼,直接使用通用暫存器的地方,但它可能只適用於合法位址之中。指標參考了儲存器中某個位址,通過被稱為反參考指標的動作,可以取出在那個位址中儲存的值。作個比喻,假設將電腦儲存器當成一本書,一張內容記錄了某個頁碼加上行號的便利貼,可以被當成是乙個指向特定頁面的指標;根據便利貼上面的頁碼與行號,翻到那個頁面,把那個頁面的那一行文字讀出來,就相當於是對這個指標進行反參考的動作。[2]
#include
using
namespace
std;
int main()
這就是定義了乙個int 型別的指標
為什麼位址還有型別呢?
c++規定乙個型別的指標只能指向同乙個型別的變數,注意,是變數,常數1,2什麼的都不可以
怎麼指向乙個變數呢?
#include
using
namespace
std;
int main()
就是這樣,其中&是取位址符,表示把a的位址傳給了指標p
為了表現他是乙個位址,我們可以嘗試輸出一下p
#include
using
namespace
std;
int main()
結果
這就是a所在位址的編號
那麼我們怎麼調取p指向的變數呢?
我們只需要加上*即可
#include
using
namespace
std;
int main()
結果
如果這裡你都還明白就比較妙了
通俗的理解,就是指向空位址的指標,它不指向任何的物件或者函式
在oi中,我們常常使用c++自帶的巨集null(任何型別都可以使用null)來 作為空指標常量
編譯器自動將其間過程的細節遮蔽,我們不需要關注這個空指標究竟指在**,以及null是如何定義的
但比較重要的一點我們要知道
訪問空指標是不合法的操作,系統在發現你訪問空指標時,會自動強制終止程式
一切萬惡的re幾乎都來自空指標
#include
using
namespace
std;
int main()
希望讀者自己寫一下這個**,親自測試一下,你會發現不會輸出test succeed語句,因為程式在訪問空指標時終止了
要記住,在你操作指標前,要運用一些手段(根據空指標特徵來判斷)這是不是空指標,否則您的程式會死無葬身之地
野指標沒什麼好講的
記住在調取指標前確保它已經被賦過值就好
否則您會莫名tle,re等等奇異操作
下面介紹指標與結構體奇妙的關係
首先是結構體成員的取用
最顯然的方法是加個*
#include
using
namespace
std;
struct qaq
;int main()
;int main()
;int main()
}*root,t[maxn<<1],*tail=t;//陣列是一段連續的位址,陣列名是首位址
node *build(int left,int right)
int mid=(left+right)>>1;
temp->ls=build(left,mid),temp->rs=build(mid+1,right);
return temp;
}
這根不算指標的內容,但是和一會要講的知識點關係密切
什麼是建構函式?
建構函式 ,是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。我們在定義乙個變數時,我們可以提前寫好乙個函式,讓他在定義時就已經賦好初值,方便我們使用
那這個東西怎麼玩呢
#include
using
namespace
std;
struct qaq
qaq(string s)//過載,在不同情況下呼叫不同的函式
};int main()
inline
void push_up()
inline
int dir()
}*root,*nil,*tmp;
node::node(int x)
inline
void init()
大概就是這樣,把nil當做null就好了
這樣構造乙個空指標,永不翻車
蒟蒻沒什麼可寫了,就先退下了
入門級演算法
今天我想記錄的是一些關於入門級別的演算法。將乙個字串s對映為乙個整數,使得該整數可以唯一的代表字串s。先假設字串均由大寫字母a z構成,不妨設a z為0 25,即將26個大寫字母對應到了二十六進製制中。按照將二十六進製制轉換為十進位制的思路,即可實現將字串對映為整數的需求。題目 給出n個字串 恰好由...
PKI入門級介紹
隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要 pki pki 究竟有什麼用?...
PKI入門級介紹
隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要 pki pki 究竟有什麼用?...