int a[5]
=;int*ptr =
(int*)
(&a +1)
;printf
("%d,%d",*
(a +1)
,*(ptr -1)
);
struct test//大小為:20
*p; p =
null
;printf
("%p\n"
, p+
0x1)
;//00 00 00 14
printf
("%p\n",(
unsigned
long
)p +
0x1)
;//00 00 00 01
printf
("%p\n",(
unsigned
int*
)p +
0x1)
;//00 00 00 04
首先 p+0x1 ==0x___?
指標加1跳過乙個元素,乙個元素佔20個位元組(結構體大小)20按十六進製制是:14
然後把 p+0x1 外加乙個(unsigned long)型別,強制轉換為無符號長整形,
再加1,結果就是1;(p指標指向空相當於0)按十六進製制列印就是0x00000001
p+0x1外加乙個 (unsigned int*)型別,轉換為指標,型別是 int 型,所以佔4個位元組
跳過4個位元組,按十六進製制列印就是0x00000004;
int a[4]
=;int*ptr1 =
(int*)
(&a +1)
;int
*ptr2 =
(int*)
((int)a +1)
;printf
("%x,%x"
, ptr1[-1
],*ptr2)
;
第乙個ptr1[-1] 和上面一樣,列印的是4;
第二個要看計算機是大端序還是小端序,如果是小段序則是下面這種:
小端位元組序:資料的高位儲存在高位址上,低位儲存在低位址上(如下圖)
大端位元組序:資料的高位儲存在低位址上,低位儲存在高位址上
問:如果這台機器是大端位元組序,則答案是?
);二 維陣列可以看成 一維陣列,指標 p 指向 a 的第乙個元素;
如果你想的是0,那就掉坑了,陣列的元素排列是:
1 35 0
0 0因為(a,b)是逗號表示式,只取後乙個數字;
int a[5]
[5];
int(
*p)[4]
; p = a;
printf
("a_ptr=%#p,p_ptr=%#p\n"
,&a[4]
[2],
&p[4][
2]);
printf
("%p,%d\n"
,&a[4]
[2]-
&p[4][
2],&a[4]
[2]-
&p[4][
2]);
int (* )[4] 和 int (*)[5] 陣列的下標不同;會出現警告,但c語言容忍了這個錯誤;
列印結果為:
a_ptr=00effdd0,p_ptr=00effdc0
00000004,4
下面是一張記憶體簡圖:
這樣的話,&a[4][2] - &p[4][2],相差4個位址,也就是16個位元組
指標減指標代表的是空的位址,不是位元組,所以是 -4
int aa[2]
[5]=
;//1 2 3 4 5
//6 7 8 9 10
int*ptr1 =
(int*)
(&aa +1)
;int
*ptr2 =
(int*)
(*(aa +1)
);printf
("%d , %d",*
(ptr1 -1)
,*(ptr2 )
);
第二個列印結果:首先可以看成是 一維陣列,int *aa[5];
int *aa[0] = ; int *aa[1] = ;int *aa[2] = ;…
所以給aa指標加一,指向了6的位址;在列印的時候減1,所以指標指向了5的位址
char
*a=;
char
**pa = a;
pa++
;printf
("%s\n"
,*pa)
;
這個比較簡單吧,二級指標指向了指標陣列名,++就是指標的指向加一,指到 at
char
*c=;
char
**cp=
;char**
*cpp = cp;
printf
("%s\n",*
*++cpp)
;printf
("%s\n",*
--*++cpp +3)
;printf
("%s\n"
,*cpp[-2
]+3)
;printf
("%s\n"
, cpp[-1
][-1
]+1)
;
這個題也比較簡單,就是比較麻煩~答案是:
point
erst
ew**指標cpp指向的是二級指標陣列,先自加1,得到的是c+2的位址,然後解引用,得到c+2,指向的是point這個指標元素的位址,最後再解引用得到point
第二步和第一步不能分開來看,因為++cpp後指標指向了c+1的位址,解引用得到c+1這個指標,指向了new的位址,自減1後指標指向了enter,最後加三代表的是指標往後移三個,最後指向了e,列印的是:er
由第二個cpp指向的是c + 1,cpp[-1][0]代表的是:c + 2,指向的是point;cpp[-1][-1]代表的是new這個位址;
指標題好難吧,不過再難多看幾遍也就會了(偷笑)
關於指標的幾道筆試題(1)
作為萌新的小週末,指標的問題一直讓我很頭疼 特意找了幾道關於指標的面試題,一起來做一下 int main int ptr int a 1 printf d,d a 1 ptr 1 return 0 程式的結果是什麼?我們先來看第乙個,a 1 我把他分解成 和 a 1 兩部分 a 1 為陣列加一,隱式...
筆試題目(1)
2012.9.16 瑞晟筆試題 憑記憶寫 1.巨集定義,一年中有多少秒 忽略閏年 2.static是什麼意思 3.volatile 是什麼意思,試舉三個例子分別說明其作用。4.cpu中cache的作用,其組織結構有哪些?5.設定位址為0x67a9的整型變數的值為0xaa66.6.用c語言寫個函式,判...
筆試題整理 1
一 簡述陣列與指標的區別?陣列要麼在靜態儲存區被建立 如全域性陣列 要麼在桟上被建立 指標可以隨時指向任意型別的記憶體塊 1 修改內容上的差別 char a hello a 0 x char p world p 0 x 指標p指向字串常量 不能修改 2 用運算子 sizeof 可以計算陣列的位元組數...