天天看點

指針筆試題解析(1)

指針對于不少人來說:是多麼一個難的代名詞呀!!當然這個裡面也包括筆者!是以……筆者對于指針滿滿的後怕!但是也有着更多的期待!畢竟陰影是用來打破的!後怕打破了,也就是龍騰虎躍的時候了!!下面進入正題:

筆者将用代碼+解析的方式來帶領大家走進:指針!!

解析題1.

#include <stdio.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int* ptr = (int*)(&a + 1);
	printf("%d %d\n", *(a + 1), *(ptr - 1));   //2   5
	return 0;
}
           

注意,筆者的代碼是在vs2022 的x86環境下進行示範的!請注意細節,若是在vs2022的x64環境下,将會出現不一樣的結果!但那個結果也是正确的!

指針筆試題解析(1)

若是有老鐵能直接看懂,并且能夠跟答案對上号,那麼這篇部落格,這位老鐵就沒有看的必要了,下面内容主要是對上面的代碼的講解!并不做其他的内容!但若是有興趣,可以進一步欣賞!

下面進入講解部分:

1.由上述的代碼,我們可以知道: int (*p)[5]=&a; 指針類型為: int (*)[5] 是一個數組指針!!

即 &a+1的類型仍為:int (*)[5] ;是以進行(int *)強制類型轉化,若不進行強制類型轉化,則會出現警告!即ptr指向:數組後面的第一個元素!對于ptr-1則指向元素5的位置!

指針筆試題解析(1)

 2。在a+1中:數組名,是數組的首元素的位址!即元素1的位址,數組名a+1,跳過一個元素,即:指向元素2的位址!在進行解引用(*)得到元素2!

指針筆試題解析(1)

是以,代碼的運作結果為:

指針筆試題解析(1)

 解析題2. (考察的為指針(+ -)加減整數的問題!)

struct test
{
	int num;
	char* pcname;
	short spate;
	char ch[2];
	short sba[5];
}*p;

int main()
{
	p = (struct test*)0x100000;
	printf("%p\n", p + 0x1);   //0x1就是十六進制下的1    //00100018

	printf("%p\n", (unsigned long)p + 0x1);           //00100001

	printf("%p\n", (unsigned int*)p + 0x1);            //00100004

	return 0;
}
           

對于上述的結構體!由于不少人目前,沒有接觸到結構體大小的計算方法,是以,筆者人為的提供該結構體的大小:20個位元組!!(對于結構體大小略微感興趣的老鐵,敬請關注筆者部落格,将會更新!)

1.在結構體中,定義的全局變量*p,是以,p是一個結構體指針變量!在x86的環境下進行示範!

2.p的值為0x100000 為十六進制int類型!指派給結構體,則需要強制類型轉化即:

    p = (struct test*)0x100000;

3.p+0x1 :—》p+1  ;指針+1,到底加的是幾??這個就是要取決于指針的類型!!

p為結構體指針,則p+1需要跳過一個結構體(20個位元組)!即 0x100000 (十六進制)+20(十進制),再将所得的結果,轉化為:十六進制!!即結果為:0x100014!

4.(unsigned long)p + 0x1  : p是一個結構體指針類型!(unsigned long)p  将p強制類型轉化為:unsigned long型,p裡面本來放一個數值,而将p強制類型轉化為:(unsigned long)整型,整型+1  :即:0x100001

5.(unsigned int*)p + 0x1  : 不管p是什麼類型,現在将p強制類型轉化為:unsigned int* 類型的指針類型,即:p轉化完成後,指向一個無符号的整型(4個位元組)!整型指針+1,跳過4個位元組!即:0x100004

是以,代碼的運作結果為:

指針筆試題解析(1)

簡簡單單的兩道題!目前已經講解完畢!接下來,筆者将會給大家,講解一些 :指針筆試題解析!來供大家參考!!!

上一篇: mysql讀送出
下一篇: 隔離器

繼續閱讀