五, 關於指標
我學C語言那年,指標內容是不作為上機考試的要求的。。。所以對這個C語言很重要的一塊內容就一直留下了一個硬傷。。。
其實我還是知道指標是什麼的,指標是一個變數,它指向一個地址,這個地址裡面可以存放某一種資料型別的一個資料,也可能是某個函式或者陣列的首地址。。。但是,我還是覺得我不理解他,為什麼呢,主要的原因是我不會用,不會用導致不想用,越不用越不會,越不會越想在程式設計的時候避開它。於是就一直死迴圈到了現在。。。
關於具體的指標的介紹和描述可以參看 C語言中文網。他描述的比我的靠譜多了,有助於清楚的理解指標到底是什麼,後面的舉例和說明也借鑑了這個網站的部分內容。
C語言中,用 * 號表示指向,比如下面程式碼中,i_pointer代表指標變數,而*i_pointer是i_pointer所指向的變數。因此,下面兩個語句作用相同:
i=3;
*i_pointer=3;
第2個語句的含義是將3賦給指標變數i_pointer所指向的變數。
我具體想總結的是,我們在程式設計的時候究竟應該怎樣使用它:
1, 定義指標變數:比如int *p1; float *p2;
第一句表示p1是一個指標變數,它的值是某個整型變數的地址。或者說p1指向一個整型變數。至於p1究竟指向哪一個整型變數,應由向p1賦予的地址來決定。第二句同理
應該注意的是,一個指標變數只能指向同型別的變數,如P32只能指向浮點變數,不能時而指向一個浮點變數,時而又指向一個字元變數。
2, 指標變數的賦值
未經賦值的指標變數不能使用,否則將造成系統混亂,甚至當機。指標變數的賦值只能賦予地址,決不能賦予任何其它資料,否則將引起錯誤。
這裡需要用到另一個運算子,&:取地址運算子,比如a是一個int變數,&a就表示變數a的地址。
有了這個運算子我們就可以對指標進行賦值:賦值有兩種很相似卻又不太一樣所以很容易弄混的方法:
方法1:int a; int *p = &a;
方法2: int a; int *p; p = &a;
上課那會看到這兩句的時候就暈了哇,做實驗的時候完全不知道什麼時候該加*什麼時候不加啊啊啊。。。我還慢慢的嘗試過,指標前面加星號編譯一遍,如果有錯誤就把星號去了再編譯一遍,哪次通過哪次算。現在想想當時好機智。。。。
其實仔細想想也不難啊,p是指標變數,*P表示指向即表示p所存的地址中所儲存的值。。。所以像 *p = &a; 肯定是錯的哇,兩邊的型別不一樣啊。。左邊的是指向的資料型別右面的是地址啊。。。
所以我們如果再有一個int型別的x,用語句 x = *p; 我們便可以通過指標變數p間接訪問變數i
3, 為什麼使用指標
雖然我編的程式比較小是一方面,主動迴避是另一方面,反正我基本不太用指標,能避開的都避開了,無非就是麻煩一點麼,程式寫的複雜混亂一點麼。但是我已經開始意識到這是不對滴~~使用指標的好處非常明顯,因為指標是變數,我們可以通過改變它們的指向,以間接訪問不同的變數,這給程式帶來靈活性,也使程式程式碼編寫得更為簡潔和有效。
4, 兩個指標比較常用的例子
第一個比較常用的例子就是指標陣列。
我們定義一個陣列和一個指標: int a[10]; int *p;
C語言規定,陣列名代表陣列的首地址,也就是第0號元素的地址。因此,下面兩個語句等價:
P = &a[0]; p = a;
所以我們便有兩種方法來訪問陣列
下標法:即用a[i]形式訪問陣列元素。
指標法:即採用*(p+i)形式,用間接訪問的方法來訪問陣列元素,
第二個就是使用指標作為函式的引數
比如下面的例子: swap(int *p1,int *p2){ int temp; temp=*p1; *p1=*p2; *p2=temp; } main(){ int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a
這個例子就體現了使用指標的好處,兩個值的互換可以通過使用指標使指向互換來實現,要注意以下的兩種方法是不能實現上述功能的,
錯法1:
swap(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}
錯法2:
swap(int *p1,int *p2){
int *p;
p=p1;
p1=p2;
p2=p;
}
道理比較好理解,只交換形參是沒有意義的。
相關文章
- 關於指標指標
- 關於指標傳遞和指標的指標指標
- 關於函式指標函式指標
- 關於this指標指向的知識回顧指標
- 指標相關指標
- 【原創】淺談指標(十二)關於static(上)指標
- 關於sizeof,對空指標sizeof(*p)可以嗎?指標
- 關於C/C++ void指標,使用void指標拷貝int 陣列C++指標陣列
- 關於引用(python中的偽指標)的理解Python指標
- (INTERBASE之五) IB技術指標 (轉)指標
- 關於C++當中的指標懸空問題C++指標
- 巧用指標平臺DataIndex,五步法輕鬆實現指標管理指標AIIndex
- NULL 指標、零指標、野指標Null指標
- 有關this指標指向問題指標
- 雙指標法相關的題指標
- 關於java中空指標異常的原因及解決方法Java指標
- C語言關於回撥函式和this指標探討C語言函式指標
- 野指標 空指標指標
- 關於App Annie全球遊戲指標報告的5個要點APP遊戲指標
- 壓力測試相關指標指標
- 雙指標相關演算法指標演算法
- 度量Web效能的關鍵指標Web指標
- 網站監測的五大指標網站指標
- 指標常量和常量指標指標
- 關於Paging + Room,RecyclerView重新整理時的空指標異常OOMView指標
- C語言關於指標,gets()和gets_s()函式的理解C語言指標函式
- 關於C/C++ int (*t5)[3] 指標型別說明C++指標型別
- 關於 智慧指標的東西指標
- 【原創】淺談指標(九)二維陣列和多級指標相關指標陣列
- 【原創】淺談指標(七)字串相關(詳細版本)與指標運算指標字串
- 技術初創公司的五個核心指標 - James指標
- 分享經濟應該專注的五個指標指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 陣列指標,指標陣列陣列指標
- ARC中強指標與弱指標指標
- 控制指標與統計指標指標
- 陣列指標 指標陣列陣列指標
- 指標指標