1樓:
輸出是2,5。*(a+1)不用說了;因為a==&a[0],&a就是整個這一行的指標,&a+1就是下一行的指標(不過這裡沒有下一行而已),實質就是&a+1指向了5後面的位置;把它強制為int *型後賦給p,p-1就只向前挪動1個int資料的空間,所以p-1指向了5,*(p-1)自然就是5。
2樓:月光疾風
列印結果分別是:2, 1
p=(int*)(&a+1)等價於*p=&a[1];注意p是指標,指向的位址,故要取a[1]的位址,前面加個取位址符&
3樓:
執行結果是:
2,5#include
int main()
;int *p;
p=(int *)(&a+1);
printf("%d,%d\n",*(a+1),*(p-1));
return 0;}
答案為什麼是5?如題 謝謝了
4樓:憽人擦
這個問題的關鍵是理解 &a a是乙個陣列名,也就是陣列的首地
址。 對a進行取位址運算子, 得到的是乙個指向陣列的指標 !!!!這句話尤為重要!
也就相當於 int (*p) [5] = &a; p是乙個指標,它指向的是乙個包含5個int元素的陣列!! 那麼執行p+1後,p的偏移量相當於 p + sizeof(int) * 5 !! 而程式中強制將指標p轉換成乙個int* 那麼 p -1 其實就是 p - sizeof(int) 所以,p -1 指向了陣列中得最後乙個元素,也就是 5
麻煩採納,謝謝!
答案為什麼是5?
5樓:匿名使用者
這個問題的關鍵是理解 &a
a是乙個陣列名,也就是陣列的首位址。
對a進行取位址運算子,得到的是乙個指向陣列的指標!!!!這句話尤為重要!
也就相當於
int (*p) [5] = &a;
p是乙個指標,它指向的是乙個包含5個int元素的陣列!!
那麼執行p+1後,p的偏移量相當於 p + sizeof(int) * 5 !!
而程式中強制將指標p轉換成乙個int* 那麼 p -1 其實就是 p - sizeof(int)
所以,p -1 指向了陣列中得最後乙個元素,也就是 5
6樓:匿名使用者
&a + 1
&a的型別為 int (*)[5] 那麼&a+1 後 +1 其實 +上5*sizeof(int)的大小
然後你你又強轉為int*型別 而p-1 減去的其實就int的大小 因為他的型別為int*
7樓:匿名使用者
肯定是5啊你認為是什麼
int a={1,2,3,4}; int *p=(int *)((int)a+1); p指向了什麼?
8樓:饅頭上線了
1. int a = {}; 貌似應該是int a = {};
2. "(int)a",已經把a的位址強轉成int型數字(32bit),所以「((int)a+1); 」實際指向了整個陣列記憶體塊的第二個位址,即a[0]的第二個位元組。
3.這種用法比較危險,特別是在某些特殊處理器上,如果對32bit(int)變數的訪問,訪問位址不是4位元組對齊的話,會有想不到的***。你可以將記憶體看做是乙個字元型的大陣列,指標其實也是乙個整數,它存貯著某個整型值,假設記憶體陣列名為m,那麼訪問指標指向的元素其實就是m[(int)p]。
在對指標本身做加減法的時候,如果增加或者減小到的值為1,那麼系統其實預設的得到的指標值是 p + sizeof(t) * 1,這裡你吧a轉換成了乙個整數,並取得了該整數加1的值,其實你的到的是p + 1,所以p的指向就向前移動了乙個位元組,指向了a【0】的第二個位元組的位址。
9樓:李磊
你可以將記憶體看做是乙個字元型的大陣列,指標其實也是乙個整數,它存貯著某個整型值,假設記憶體陣列名為m,那麼訪問指標指向的元素其實就是m[(int)p]。在對指標本身做加減法的時候,如果增加或者減小到的值為1,那麼系統其實預設的得到的指標值是 p + sizeof(t) * 1,這裡你吧a轉換成了乙個整數,並取得了該整數加1的值,其實你的到的是p + 1,所以p的指向就向前移動了乙個位元組,指向了a【0】的第二個位元組的位址。
其實指標的這種特性會經常使用在同種型別值需要不同解釋的情況,比如要判斷機器的大小端(大小端可以上網查詢),你可以定義乙個共用體:
union hl;
在程式中你可以初始化:
hl.ele = 0;
然後你再定義乙個字元型指標:
char *p = hl.ele[0];
你就可以通過(*p)的值判斷機器的大小端了。
這兩個定義有什麼區別?
10樓:匿名使用者
這段**應該出自
<在前面部分他就給出了這段**,在後面他有做過詳細的解釋,在這裡我只給樓主將樓下的回答做下參考並做簡要分析:
底樓完全不懂指標跟陣列之間的關係,建議樓主直接略過!
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(一般微控制器是大端儲存的,摩托羅拉的晶元也是)
11樓:匿名使用者
首先,a是乙個陣列名(不然這樣寫沒啥意義,本題考的是陣列指標和陣列首元素指標的區別)
那麼&a表示整個陣列的指標,它的值和陣列a首元素的位址值一樣,但是這個指標指向的記憶體大小是整個陣列的總大小。那麼&a+1表示的就是整個陣列a最後乙個元素的下乙個記憶體單元開始陣列指標,再把這個指標轉換成int的指標,那麼ptrl就指向了陣列a最後乙個元素之後的下乙個記憶體單元開始的4個位元組(int*)記憶體。
單單的a表示的是陣列a的首元素的指標,把它轉換成int就是取這個位址值,然後加一,再轉換成int*型別的指標,那麼ptr的值就是陣列a首元素中從第二個位元組開始的三個位元組,再加上陣列a第二個元素的第乙個位元組,一共這四個位元組的指標。
12樓:匿名使用者
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的話,就不可知了,因為那個地方原本放什麼東西不可**。
13樓:匿名使用者
第乙個表示變數a的地編譯1個單位,然後將這個指標強制轉化int型別的指標賦予ptrl
第二個表示將a變數強制轉換為int型別,然後+1,然後將這個值強制換為int指標賦予ptr
兩個賦值得到的值截然不同
14樓:
這兩個的作用是一樣的,都是把a指標指向的位置向後移乙個元素。只是這兩種寫法實在太2。如果想從第乙個元素指向第二個元素,只要這樣寫就行 int * ptr = a[1],這就是指向第二個元素了
c語言指標,int a=1; int *p; 其中p=&a和*p=&a有什麼區別?p的值是否相同?
15樓:匿名使用者
指標本質就是儲存記憶體位址的乙個變數。所以指標可以指向某個變數在記憶體中儲存的單元格嘛。變數去訪問單元格最後也是編譯器通過變數名和位址一一對應去查詢的。
而指標裡面直接儲存的就是位址,所以直接可以訪問位址所對應的單元格。
不知道樓主說的是說明情況。所以幾種可能的都說一下:
測試**
#include "stdio.h"
#include "conio.h"
main()
int *p=&a ; 這是很標準的,把a的位址個p指標變數。
int *q;q=&a;這也是很標準的。定義乙個指標變數,然後將a的位址賦值給她。
int *r; *r=&a; 首先r是個指標變數,但是r指向記憶體中那個單元格呢?r沒有賦初值就開始用了。這是很嚴重的。
r是個游離態的指標。 *r表示取出r對應的那個位址中的值。r都沒有指向乙個具體的單元格,如何去取值啊。
16樓:冰水清清藍
int *p中其一般形式為:
型別說明符 *變數名;
其中,*表示這是乙個指標變數,變數名即為定義的指標變數名,型別說明符表示本指標變數所指向的變數的資料型別。
例如: int *p1;
表示p1是乙個指標變數,它的值是某個整型變數的位址。或者說p1指向乙個整型變數。至於p1究竟指向哪乙個整型變數,應由向p1賦予的位址來決定。
p就是位址。*p是乙個指標型變數 *p=&a錯誤
17樓:匿名使用者
p=&a 是將變數a的位址賦給指標p本身的儲存單元
*p=&a 是將a的位址賦給指標p所指向的記憶體單元
第二種由於沒有對指標初始化,*p不知道指向什麼單元(有可能是重要的系統單元),所以這樣的操作很危險。
18樓:十面埋伏炸
不相同,p是指該指標的位址,向它賦值是將p指向另乙個位址,而*p是指向p位址的指標,它是可以直接賦值的。希望可以幫助你~~~
C語言中y ab a b 1運算結果是什麼和 是什麼意思?求詳解
表示式1?表示式2 表示式3 以上是三元運算子,c語言中唯一的乙個三元運算子如果表示式版1的結權果為真 則返回表示式2的值,否則返回表示式3的值y a b?a b 1 如果a b,那麼y的值為a,否則y的值為b 1 a 1,逗號只是留下右邊的b a,a先自加1變成2,給b賦值,2作為整個賦值表示式的...
汽車搖號結果查詢結果是審核通過是什麼意思
審核通過就是你提供的申請內容準確無誤,已經通過審核,取得揺號資格。是否能獲得號牌還要查詢搖號結果,什麼時候在 審核通過 的位置變成 中籤 就可以上牌了,有效期屆滿可以申請延期,否則有效期失效就要重新辦理申請手續。個人有效編碼的有效期為3個月。該有效編碼未獲得指標的,有效期內自動轉入次月配置。需要延長...
B型肝炎dna結果是319107是什麼意思
hbv dna即是B肝病毒的脫氧核糖核酸 即B肝病毒基因 hbv dna是hbv感染最直接 特異性強和靈內 敏性高的指標,容hbv dna陽性,提示hbv複製和有傳染性。hbv dna越高表示病毒複製越厲害,傳染性強。hbv dna陽性從B肝病毒定量上分析則通常說明B肝患者體內的B肝病毒數目超過了1...