int ptrl inta 1int ptr intint a 1 這兩個定義有什麼區別

2021-03-20 04:06:43 字數 2622 閱讀 4903

1樓:匿名使用者

這段**應該出自

<在前面部分他就給出了這段**,在後面他有做過詳細的解釋,在這裡我只給樓主將樓下的回答做下參考並做簡要分析:

底樓完全不懂指標跟陣列之間的關係,建議樓主直接略過!

4樓的解釋是非常正確的。想必4樓似乎精通指標跟陣列之間的微妙的種種聯絡,似乎也懂組合語言

完整的**應該是這樣的吧 樓主?:

int main()

;int *ptr1=(int*)(&a+1);

int *ptr2=(int*)((int)a+1);

printf("%x,%x",ptr1[-1],*ptr2);

return 0;

}第乙個輸出的是5 毫無疑問,4樓給了你很詳細的解答

第二個的輸出 在不同的cpu上結果是不一樣的

在 小端儲存的cpu (intel這些)上 陣列a的記憶體布局如下:(簡單起見,記憶體位址這裡從0開始)

00000000 :01 00 00 00 02 00 00 00

00000008 :03 00 00 00 04 00 00 00

00000010 :05 00 00 00

由於a的值 就是00000000 但是對a=a+1 之後 a會變成 00000004,因為加的是1*sizeof(int)個位元組,但是把a強制型別轉換成int之後就編變成 數值 00000000 了,不在有位址的任何附加屬性,對其進行+1 操作也是純粹數學上的加1 變成00000001

此時又強制型別轉換成(int*) 那麼此時指向的記憶體內容是 00 00 00 02 00 00 00

對其取內容(以%x的方式取,取4個位元組) 取出來 是00 00 00 02 ,這個按16進製制解釋出來就是 2000000

大端儲存大同小異:記憶體布局 00 00 00 01 00 00 00 02

(int*)((int)a+1)之後指向 00 00 01 00 00 00 02

結果便是10000(一般微控制器是大端儲存的,摩托羅拉的晶元也是)

2樓:匿名使用者

首先,a是乙個陣列名(不然這樣寫沒啥意義,本題考的是陣列指標和陣列首元素指標的區別)

那麼&a表示整個陣列的指標,它的值和陣列a首元素的位址值一樣,但是這個指標指向的記憶體大小是整個陣列的總大小。那麼&a+1表示的就是整個陣列a最後乙個元素的下乙個記憶體單元開始陣列指標,再把這個指標轉換成int的指標,那麼ptrl就指向了陣列a最後乙個元素之後的下乙個記憶體單元開始的4個位元組(int*)記憶體。

單單的a表示的是陣列a的首元素的指標,把它轉換成int就是取這個位址值,然後加一,再轉換成int*型別的指標,那麼ptr的值就是陣列a首元素中從第二個位元組開始的三個位元組,再加上陣列a第二個元素的第乙個位元組,一共這四個位元組的指標。

3樓:匿名使用者

int *ptrl=(int*)(&a+1),第乙個變數,將a的位址往後偏移乙個單位。注意,這裡的乙個單位是sizeof(a的資料型別),然後再將這個位址轉化為int 型別的指標位址。

int *ptr=(int*)((int)a+1),簡單起見可以假設a原來的資料型別是double,這裡先將a下轉型成int型別,假設轉換之後(int )a=99,則處理為int *ptr=(int *)100; 也就是ptr 指向記憶體中位置為100的地方,這時候如果輸出ptr,ptr=100,如果輸出*ptr的話,就不可知了,因為那個地方原本放什麼東西不可**。

4樓:匿名使用者

第乙個表示變數a的地編譯1個單位,然後將這個指標強制轉化int型別的指標賦予ptrl

第二個表示將a變數強制轉換為int型別,然後+1,然後將這個值強制換為int指標賦予ptr

兩個賦值得到的值截然不同

5樓:

這兩個的作用是一樣的,都是把a指標指向的位置向後移乙個元素。只是這兩種寫法實在太2。如果想從第乙個元素指向第二個元素,只要這樣寫就行 int * ptr = a[1],這就是指向第二個元素了

6樓:楊帆

這題的關鍵在

baiint *ptr=(int *)(&a+1);這一句上,&a表示取du得陣列zhia儲存dao區域的首內位址,再加1表示陣列a儲存區域的後容的位址,這就使得ptr指標指向陣列的最後乙個元素後面的那個儲存單元的位址,而ptr減1後,再進行資料訪問,則訪問的是ptr指標的前乙個儲存單元的值,所有最後的答案是2,5

7樓:金色潛鳥

&a 可以看抄成 你 宣告了:

int a[2][5]=;

&a 是襲

位址 &a[0][0]

&a + 1 是 位址 &a[1][0];

所以 , ptr 的 初始化 指向 了 a 的 首位址 加 偏移 sizeof(int) * 5

----

int a[5]=;

printf("%d%d",*(a+1),*(ptr-1));

語句中 *(a+1) 就是 a[1], 輸出 2*(prt-1) 就是 a[4], 輸出 5,

1和9這兩個數字哪個比較好看,7和9這兩個數字哪個比較好哪個比較好看?

哪個比較好看?不知道閣下是用來做什麼的?應該是各人審美不同吧 9好看,有圓潤之美。從外觀,我感覺9比較漂亮 自己偏愛哪個 哪個就好 我喜歡9 要看你是從哪個角度來看 7和9這兩個數字 哪個比較好哪個比較好看?這取決於個人喜好,還有用在什麼地方。從事房地產事業的人偏好7,諧音 起 也有人偏好事業 長久...

SAP研發和SAP模組這兩個職位有什麼區別

sap顧問主要分兩類。一是應用顧問。二是開發顧問。應用顧問主要是業務層面的,如以上兩位說的fi,co,mm,sd,pp等等就不一一贅述了。開發顧問主要是abap開發,basis,xi 開發顧問一般不涉及業務,他們的工作是屬於計算機應用層面的,為業務顧問解決非業務問題。個人建議,僅供參考。以上。招聘企...

這兩個有什麼區別,聯通這兩個網有什麼區別

1 不同的產品都有其不同的特點和優點,產品的設計 目標人群 售後服務等等很多方面都有比較明顯的區別。2 建議根據個人的使用需要 喜好以及實際預算,加上通過實體店或者 的產品對比,選擇適合自己的產品。沒區別啊,連產品圖都是同一張 360安全是360的主打產品,極速嘛,不好說,不重視 這兩個有什麼區別?...