指標筆試題1

2021-09-12 07:48:07 字數 3731 閱讀 9224

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 可以計算陣列的位元組數...