日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C指针3:指针变量的运算

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C指针3:指针变量的运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由上節介紹我們知道,通過指針可以修改內存上的數據,并進一步可以交換數據。這種操作實際上也是在對地址進行操作運算。具體怎么實現指針變量的元素呢?為什么能實現指針變量的運算呢?

因為指針變量保存的是地址,而地址本質上是一個整數,所以指針變量可以進行部分運算,例如加法、減法、比較等。

#include <stdio.h>
#include <iostream>
using namespace std;int main() {int    a = 8, *pa = &a, *paa = &a;double b = 70.3, *pb = &b;char   c = '#', *pc = &c;//最初的值----打印地址cout << "---打印最初的7個地址---" << endl;printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);printf("pa=%#X, paa=%#X,pb=%#X, pc=%#X\n", pa, paa, pb, pc);//pa和paa地址一樣,因為都是指向a。//------------打印數據cout << "---打印最初的7個數據---" << endl;cout << a <<" , "<< b << " , " << c << endl;cout << *pa << " , " << *paa << " , " << *pb << " , " << *pc << endl;//*pa和*paa數據一樣,因為都是指向a。//加法運算----打印地址pa++; pb++; pc++;cout << "---打印加法后的7個地址---" << endl;printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);printf("pa=%#X, paa=%#X,pb=%#X, pc=%#X\n", pa, paa, pb, pc);//------------打印數據cout << "---打印加法后的7個數據---" << endl;cout << a << " , " << b << " , " << c << endl;cout << *pa << " , " << *paa << " , " << *pb << " , " << *pc << endl;//減法運算---打印地址pa -= 2; pb -= 2; pc -= 2;cout << "---打印減法后的7個地址---" << endl;printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);printf("pa=%#X, paa=%#X,pb=%#X, pc=%#X\n", pa, paa, pb, pc);//------------打印數據cout << "---打印減法后的7個數據---" << endl;cout << a << " , " << b << " , " << c << " , " << endl;cout << *pa << " , " << *paa << " , " << *pb << " , " << *pc << endl;//比較運算-----打印數據if (pa == paa){printf("%d\n", *paa);cout << *paa << endl;}else{printf("%d\n", *pa);cout <<"不相等"<< *pa << endl;}return 0;
}

結果展示:

pa執行++之后,因為pa指向的是int型所以地址加4,pa此時指向了新的地址,至于新地址里邊是什么數據我們沒有對他進行賦值,所以不能操作極其危險,此時系統里邊存的是1,所以就給我們1,至于為什么是1,我們不知道。

有上述代碼可以看出:指針變量除了可以參與加減運算,還可以參與比較運算。當對指針變量進行比較運算時,比較的是指針變量本身的值,也就是數據的地址。如果地址相等,那么兩個指針就指向同一份數據,否則就指向不同的數據。

從運算結果可以看出: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 的指針,如下圖所示:

剛開始的時候,pa 指向 a 的開頭,通過 *pa 讀取數據時,從 pa 指向的位置向后移動 4 個字節,把這 4 個字節的內容作為要獲取的數據,這 4 個字節也正好是變量 a 占用的內存。

如果pa++;使得地址加 1 的話,就會變成如下圖所示的指向關系:

這個時候 pa 指向整數 a 的中間,*pa 使用的是紅色虛線畫出的 4 個字節,其中前 3 個是變量 a 的,后面 1 個是其它數據的,把它們“攪和”在一起顯然沒有實際的意義,取得的數據也會非常怪異。

如果pa++;使得地址加 4 的話,正好能夠完全跳過整數 a,指向它后面的內存,如下圖所示:

我們知道,數組中的所有元素在內存中是連續排列的,如果一個指針指向了數組中的某個元素,那么加 1 就表示指向下一個元素,減 1 就表示指向上一個元素,這樣指針的加減運算就具有了現實的意義。

不過C語言并沒有規定變量的存儲方式,如果連續定義多個變量,它們有可能是挨著的,也有可能是分散的,這取決于變量的類型、編譯器的實現以及具體的編譯模式,所以對于指向普通變量的指針,我們往往不進行加減運算,雖然編譯器并不會報錯,但這樣做沒有意義,因為不知道它后面指向的是什么數據。PS:警告讀者不要嘗試通過指針獲取下一個變量的地址(因為你定義的幾個變量他們可能并不挨著,它們中間還參雜了別的輔助數據)。

如上面的例子,在比較 pa 和 paa 的值時,pa 已經指向了 a 的上一份數據,所以它們不相等。而 a 的上一份數據又不知道是什么,所以會導致 printf() 輸出一個沒有意義的數,這正好印證了上面的觀點,不要對指向普通變量的指針進行加減運算。

參考:C語言中文網

?

?

總結

以上是生活随笔為你收集整理的C指针3:指针变量的运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。