<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [指針]變量保存的是地址,而地址本質上是一個整數,所以指針變量可以進行部分運算,例如加法、減法、比較等,請看下面的代碼: ``` #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c); printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //加法運算 pa++; pb++; pc++; printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //減法運算 pa -= 2; pb -= 2; pc -= 2; printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //比較運算 if(pa == paa){ printf("%d\n", *paa); }else{ printf("%d\n", *pa); } return 0; } ``` 運行結果: ~~~ &a=0X28FF44, &b=0X28FF30, &c=0X28FF2B pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A 2686784 ~~~ 從運算結果可以看出:pa、pb、pc 每次加 1,它們的地址分別增加 4、8、1,正好是 int、double、char 類型的長度;減 2 時,地址分別減少 8、16、2,正好是 int、double、char 類型長度的 2 倍。 這很奇怪,指針變量加減運算的結果跟數據類型的長度有關,而不是簡單地加 1 或減 1,這是為什么呢? 以 a 和 pa 為例,a 的類型為 int,占用 4 個字節,pa 是指向 a 的指針,如下圖所示: ![](https://img.kancloud.cn/a8/b3/a8b394907d825ebbc59cf1b99641c28f_289x96.jpg) 剛開始的時候,pa 指向 a 的開頭,通過 \*pa 讀取數據時,從 pa 指向的位置向后移動 4 個字節,把這 4 個字節的內容作為要獲取的數據,這 4 個字節也正好是變量 a 占用的內存。 如果`pa++;`使得地址加 1 的話,就會變成如下圖所示的指向關系: ![](https://img.kancloud.cn/fe/a0/fea0411e729f3ca7cad1294e1da7307a_289x117.jpg) 這個時候 pa 指向整數 a 的中間,\*pa 使用的是紅色虛線畫出的 4 個字節,其中前 3 個是變量 a 的,后面 1 個是其它數據的,把它們“攪和”在一起顯然沒有實際的意義,取得的數據也會非常怪異。 如果`pa++;`使得地址加 4 的話,正好能夠完全跳過整數 a,指向它后面的內存,如下圖所示: ![](https://img.kancloud.cn/97/d5/97d53b63dbb9502b88fbcda2a547a835_289x101.jpg) 我們知道,數組中的所有元素在內存中是連續排列的,如果一個指針指向了數組中的某個元素,那么加 1 就表示指向下一個元素,減 1 就表示指向上一個元素,這樣指針的加減運算就具有了現實的意義,我們將在《[C語言數組指針](http://c.biancheng.net/view/1993.html)》一節中深入探討。 不過C語言并沒有規定變量的存儲方式,如果連續定義多個變量,它們有可能是挨著的,也有可能是分散的,這取決于變量的類型、編譯器的實現以及具體的編譯模式,所以對于指向普通變量的指針,我們往往不進行加減運算,雖然編譯器并不會報錯,但這樣做沒有意義,因為不知道它后面指向的是什么數據。 下面的例子是一個反面教材,警告讀者不要嘗試通過指針獲取下一個變量的地址: ~~~ #include <stdio.h> int main(){ int a = 1, b = 2, c = 3; int *p = &c; int i; for(i=0; i<8; i++){ printf("%d, ", *(p+i) ); } return 0; } ~~~ 在 VS2010 Debug 模式下的運行結果為: 3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460, 可以發現,變量 a、b、c 并不挨著,它們中間還參雜了別的輔助數據。 指針變量除了可以參與加減運算,還可以參與比較運算。當對指針變量進行比較運算時,比較的是指針變量本身的值,也就是數據的地址。如果地址相等,那么兩個指針就指向同一份數據,否則就指向不同的數據。 上面的代碼(第一個例子)在比較 pa 和 paa 的值時,pa 已經指向了 a 的上一份數據,所以它們不相等。而 a 的上一份數據又不知道是什么,所以會導致 printf() 輸出一個沒有意義的數,這正好印證了上面的觀點,不要對指向普通變量的指針進行加減運算。 另外需要說明的是,不能對指針變量進行乘法、除法、取余等其他運算,除了會發生語法錯誤,也沒有實際的含義。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看