C指標解析 ------ 指標的算術運算

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   使用   ar   for   sp   

       本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020

       指標是一個特殊的變數,表示一個地址,而地址可以上減去或加上一個整數,從而可以表示新的地址.

     下面通過一段代碼來分析指標的算術運算: 

#include <stdio.h>int main(){int i;char str[]={'a','b','c','d','e'};int *p = str;char *q = str;q++;p++;printf("數組str的首地址:%x\n",str);printf("指標q指向的內在區:%x\n",q);printf("指標p指向的記憶體區:%x\n",p);printf("數組的第一個元素的值:%c\n",*str);printf("數組的第一個元素的值:%c\n",*p);//遍曆數組第一種方法,下標法printf("遍曆數組第一種方法,下標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",str[i]);//遍曆數組第二種方法,數組名指標法printf("\n遍曆數組第二種方法,數組名指標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",*(str+i));//遍曆數組第三種方法,指標法q = str;printf("\n遍曆數組第三種方法,指標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",*q++);}
     執行結果:


         可以看出,數組的首地址為163c4730.通過上節的指標的概念和四個要素,很容易得知,指標q的類型為char*,且指標q指向的類型為char; char *q = str;的作用是將數組str的首地址賦給指標q,也就是說指標q的值或q指向的記憶體區就是數組str的首地址. 接下來,指標q自加1,這時,編譯器是這樣處理的,它把指標q的值加上了sizeof(char),也就是在原來的地址的基礎上向後移動了一個位元組,即指標q的指向的記憶體區為163c4730+1=163c4731. 同理,指標p的類型為int*,且指向的類型為int,  int *p = str; 作用也是將數組的首地址賦給指標p,p++,編譯器將把指標p的值加上了sizeof(int),也就是在原來的基礎上向後移動了4個位元組,即指標p指向的記憶體區為163c4734,所以指標p在自加前,是指向數組第0號單元開始的四個位元組,在自加1後指向了數組第四號單元開始的四個位元組。

        因此,判斷指標向後移動的多少位時,需要判斷指標指向的類型。

      

        也可以用指標來遍曆數組,如上述代碼,可以使用數組名,因為這裡的數組名就是指向了數組的第0號單元,如果在此基礎上加上一個位移量,就可以訪問數組的其他元素,因此,可以用數組名+位移量來遍曆數組。同理,另設一個指標指向數組的第0號單元,每次指標自加1,就可以遍曆整個數組,這裡要注意,指標的所指向的類型,要和數組的元素類型要一致,所以上述代碼中用指標q來遍曆數組,而不是用指標p來遍曆。

        當然,如果指標減去一個整數,處理過程和加上一個過程類似,只是向前移動了,而不是向後移動。

        總結一下,一個指標ptrold加上一個整數n後,結果是一個新的指標ptrnew,ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值增加了n乘sizeof(ptrold所指向的類型)個位元組。就是說,ptrnew所指向的記憶體區將比ptrold所指向的記憶體區向高地址方向移動了n乘sizeof(ptrold所指向的類型)個位元組。一個指標ptrold減去一個整數n後,結果是一個新的指標ptrnew,ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值減少了n乘sizeof(ptrold所指向的類型)個位元組,就是說,ptrnew所指向的記憶體區將比ptrold所指向的記憶體區向低地址方向移動了n乘sizeof(ptrold所指向的類型)個位元組。


  

       

C指標解析 ------ 指標的算術運算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.