c語言指標回顧 指標基礎

2021-08-21 21:09:53 字數 1940 閱讀 7233

學習c++已經快一年了,最近打算整理一下所學的知識,就當是系統地複習一遍,指標方面包括指標的簡單介紹、使用指標常見的錯誤、指標與陣列、指標與函式、指標陣列和陣列指標。

任何剛開始學習c語言的人如果被難住了,那一定是卡在指標這邊了,其實指標並沒有這麼可怕,我這邊就挑兩個重點來講了,如下:

1、指標是一種資料型別

2、間接賦值是指標存在的最大意義

第一點是什麼意思呢,其實也沒啥意思,比如int a=1;float b=1.0;char c='a',這邊int是整型,float是浮點型,char是字元型,它們都可以稱為是一種資料型別,所以我想說的是指標其實也只是一種資料型別,只不過是專門存放位址的資料型別而已,int a;int *p=&a;首先宣告了乙個變數a,然後宣告了乙個int*的變數p,將變數a的位址賦值給變數p,int*就是我想說的那個資料型別,這個資料型別你想怎麼寫都可以,不過至少要有乙個*,int *p1;資料型別int*,存放整型變數的位址,int **p2,資料型別 int**,存放int*變數的位址,這其實就是二級指標了,*的數量是沒有限制的,int **....* p100,100個*也是可以的,反正p100的值等於乙個位址,這個位址是乙個99級指標變數的位址。

第二點,間接賦值是指標存在的最大意義又是什麼意思呢。請看下面的**:

#include void main(int argc,char** argv)

這個程式非常的簡單,最後的結果是6,但是這並不能體現出指標存在的意義,我費盡周折改變了a的值,為什麼不直接通過a=6的方式來改變呢?請再看下面的程式:

#includevoid swap1(int a,int b)

void swap2(int*p1,int *p2)

}void main(int argc,char**argv)

這個程式想交換兩個int型別變數的值,首先嘗試swap1函式,最後列印的結果是"a=1,b=2",說明交換失敗了,為什麼呢?因為將a和b傳給形參a和形參b,只是將a和b各自的乙份拷貝給了形參a和形參b,你怎麼使用這份拷貝,不關a和b的事。可是現在我就是想通過函式的形式來交換a和b,那該怎麼做?很簡單,把變數a和變數b的位址拷貝乙份,傳給函式,在函式裡通過這兩個位址訪問main函式裡的a和b,就像我把我家鑰匙給你一把,雖然是拷貝的一把鑰匙,但是你照樣可以用這個鑰匙來開啟我家的門,不信的話可以嘗試執行這個程式,第二次輸出的就是"a=2,b=1",這就是指標能做到其它資料型別做不到的事。

在32位作業系統下,每種資料型別都有他對應的大小,因為每種資料型別儲存資料的能力是不一樣的,那麼指標型別的大小是多少呢?只要通過printf("%d",sizeof(type* ));就可以知道了,這裡type可以是各種型別,最後我們發現,無論是int*,還是float*,還是int**,列印出來都是4,也就是說指標型別是四個位元組,為什麼這些不同型別的指標都是四個位元組呢,上面也提到了,指標變數就是存放位址的,所以這也就表示32位作業系統下,位址用四個位元組表示,那為什麼偏偏是四個位元組,這和cpu定址能力有關,因此,32位作業系統和64位作業系統的指標大小是不一樣的,想要了解什麼是cpu定址能力的可以看王爽老師寫的《組合語言第2版》(可能有第3版了)的前幾個章節,介紹的非常詳細。

既然不管是什麼型別的指標,在32位下都是4個位元組,那麼還要指標型別做什麼,為何不都用void*呢?其實指標的型別主要影響對記憶體的解析方式,請看下面的**:

#include#includetypedef struct position

position, *lposition;

void main(int argc, char**argv)

如圖所示,如果以int*的方式去解析結構體變數的記憶體,那麼一次只會取出四個位元組,所以這個程式列印出的是p1.x和p1.y的值。

這篇部落格暫時就總結這麼多了,如果您發現有什麼問題希望能夠指出,感激不盡!

c語言指標回顧 指標常見錯誤

這篇部落格主要總結一下我在使用指標的時候遇到過的各種錯誤 指標變數建立的時候如果沒有初始化,這個時候指標變數的值是乙個隨機值,這個時候通過這個指標訪問記憶體是很危險的,請看下面的 include void main int argc,char argv 還有一種情況是本來對一塊記憶體是有訪問許可權的...

C語言 變數與指標 回顧

char a 0 鞋櫃型別為char,容量為1。2.0 陣列 chara 6 橫向6個鞋櫃格仔 3.0 二維陣列 chara 5 6 五行六列的鞋櫃 inta 4 5 五行六列的鞋櫃格仔,每個鞋櫃格仔 容量為char型鞋櫃的四倍,容量為4。4.0 陣列指標 inta 5 6 五行六列的鞋櫃,鞋櫃格仔...

C語言指標基礎

c語言指標 前導程式 1 include2 3 4 5 void change int 6 7 int main 8 9 20 21 22 23 void change int n 24 25 30 31 一 基本知識點 int a 10 int p 定義乙個int型別的指標 p a 指標變數p指向...