你必須知道的指標基礎 3 指標的移動及指標的危險

2021-09-07 22:36:39 字數 3294 閱讀 7794

指標每次加一就是指標向前移動指標型別對應的位元組數。下面通過乙個int指標來指向乙個int陣列,看看指標的加法運算到底是個什麼鬼?

int nums=;

int* ptr =nums;

printf(

"%d\n

",*ptr);

ptr++; //

ptr是int型別的指標,所以向後移動4個位元組

printf("

%d\n

",*ptr);

ptr+=2; //

向後移動2*4 個位元組

printf("

%d\n

",*ptr);

執行結果如下圖所示:

可以看到,指標的加法就是向前移動指定型別位元組數,在陣列中就是指向下乙個元素。

下面再來看看與加法相反的減法,仍然以上面的**為例,新增一句:ptr--;

int nums=;

int* ptr =nums;

printf(

"%d\n

",*ptr);

ptr++; //

ptr是int型別的指標,所以向後移動4個位元組

printf("

%d\n

",*ptr);

ptr+=2; //

向後移動2*4 個位元組

printf("

%d\n

",*ptr);

ptr--;

printf(

"%d\n

",*ptr);

執行結果如下圖所示:

可以看出,減法即代表向後移動指標型別對應的位元組數

char s1="

hello edisonchou.cn";

char* p=s1;

p=p+2; //

char型別佔乙個位元組,因此這裡向後移動2*1個位元組

printf("

%s\n

",s1);

printf(

"%s\n

",p);

這裡實現了乙個類似於求子串的操作,執行結果如下圖所示:

同型別指標相減,得出的是相距的資料型別的長度。下面以兩個指向同乙個int陣列的int型別指標為例,驗證一下是否得到相距的資料型別的長度:

int nums=;

int* ip1=nums;

int* ip2=nums;

ip2=ip2+3; //

同型別指標相減得出的是相距的資料型別的長度

printf("

the distance is %d\n

",ip2-ip1);

當ip2-ip3得到的是距離是3,這是因為ip2在進行減法操作之前已經向前移動了3個int型別的長度。

剛剛了解了指標的移動的強大,現在我們來看看指標的強大所帶來的一些「危險」。例如下面一段**,我們定義了兩個int型別的整數。

int i1=555

;

int i2=666

;

int* p=&i1;

printf(

"%d,%d\n

",&i1,&i2);

p--;

int i3=*p; //

從p當前指向的記憶體中取出4個位元組,解釋成i3

printf("

%d\n

",i3);

在指標p的定義中,我們指向的是i1。而當我們對p指標進行減法運算移動時,我們發現當前p指標指向的居然不是i1而是i2了。這也就說明,本來宣告指標時指向的是你家的位址,而當對指標進行運算操作後卻指向了隔壁老王家的位址,這是搞什麼鬼!

可以從執行結果圖看出,i1和i2的位址分別為2686740和2686736(是連續的位址),p指標最開始指向的是i1。而當p向後移動之後,此時已經指向了i2。因此,輸出的值為666。

繼續上面的例子,我們此時再將p指標向後移動,看看此時p指標所指向的內容的值是多少?當我們再把p指標向後移動99999位時,其所指向的內容的值又是多少?

int i1=555

;

int i2=666

;

int* p=&i1;

printf(

"%d,%d\n

",&i1,&i2);

p--;

int i3=*p; //

從p當前指向的記憶體中取出4個位元組,解釋成i3

printf("

%d\n

",i3);

p--;

printf(

"%d\n

",*p);

當執行程式後,結果變為了下圖:

那麼,這個4200782位址是個什麼鬼?它存放的又是什麼內容?我們不得而知,這也是另乙個程式裡邊某個變數所儲存的位置,但現在在我們這個程式中居然通過指標訪問到了!這是個可怕的事情!想想,當a程式中的指標通過移動取得了b程式中的記憶體位址或資料內容,再對指針對其修改資料,這是一件不安全的事兒!想想一幫苦逼程式設計師辛辛苦苦加班加點做的遊戲,輕而易舉地就被掛了外掛程式,本來需要用rmb才能買的積分或者道具讓外掛程式直接給改了,是不是覺得人生已經沒有意義啦?

下面一段**則展示了,當指標移動的距離過大時,windows系統會對此訪問限制,程式直接報錯。

p-=99999; //

這個記憶體位址可能是無法訪問的,又被稱為訪問越界

//windows對此做了訪問越界的限制

printf("

%d\n

",*p);

執行結果是,直接崩潰,彈出錯誤按鈕:

錯誤框的出現,代表了指標使用不當的危害,會給客戶造成一定時間的延遲服務。因此,指標雖然很強大,但是也很危險!

如鵬網,《c語言也能幹大事(第三版)》

出處:

C語言基礎 C語言指標 3 指標的指標

上節課,我們講解了一些注意的事項以及指標的寫法,這節課我們來講解一下什麼叫做指標的指標.指標的指標,顧名思義就是指向指標的指標,當有乙個定義了乙個整型變數,定義乙個指標變數指向該整型變數,那麼指標變數存的位址就是整型變數的位址,而指標的指標指向該指標,那麼存的就是該指標的位址,下面我們看看示意圖 在...

4 1 指標的基礎

1 指標的本質 指標在本質上也是乙個變數 指標需要占用一定的記憶體位址 指標用於儲存記憶體位址的值 不同型別的指標占用的記憶體空間大小相同 位址匯流排32位機,4個位元組 2 號的意義 在指標宣告時,號表示所宣告的變數為指標 在指標使用時,號表示取指標所指向的記憶體空間的值 號類似一把鑰匙,通過這把...

Linux世界你必須知道的

突然從windows世界轉向linux世界,也許剛開始或多或少都有點不太適應,慢慢地,也許你會發現linux的博大精深,最重要的是linux世界的很多東西都是free license,下面列舉一下linux世界你需要或必須知道的二三事。unix like 叫做 類unix 系統,主要指各種各樣的li...