指針筆試題(C語言進階)

目錄

前言

1、案例一

1.1 答案

1.2 解析

2、案例二

2.1 答案

2.2 解析

3、案例三

3.1 答案

3.2 解析?

4、案例四

4.1 答案

4.2 解析

5、案例五

5.1 答案

5.2 解析

總結


前言

? ? ? ? “紙上得來終覺淺,絕知此事要躬行”。本篇通過對指針實際案例的分析,由淺入深,來加強我們對指針的理解。

1、案例一

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

? ? ? ? 先自己想想,下面公布答案。

1.1 答案

????????答案是2,5。

1.2 解析

? ? ? ? 其實第一個輸出的2比較好理解,主要是第二個輸出可能會有疑問。

? ? ? ? 對于*(a+1),本身a表示數組的首元素地址,a+1表示數組的第二個元素的地址,因此解引用a+1得到的結果就是數組的第二個元素的值:2。(解引用就是*)

? ? ? ? 對于*(ptr-1),首先我們看看ptr是什么,前面定義 ptr = (int*)(&a + 1); 首先,&a表示將整個數組的地址取出來,其類型為 (int*)[5],大小是5個整型的大小,所以&a+1直接跳過整個數組,指向數組后面一個位置的地址,但是最后又通過(int*)強制將其轉化成了int*類型,步長變回一個整型的大小,所以ptr其實就是指向數組最后一個元素后面一個位置地址的指針,類型為(int*)類型,步長為1個整型數據的大小。因此,輸出時,ptr-1其實只往回跳了一個整型大小的長度,指向了數組第五個元素(最后一個元素),再解引用得到的答案就是5啦。

2、案例二

#include <stdio.h>
struct Test
{int Num;char* pcName;short cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
//假設p 的值為0x100000。如下表達式的值分別為多少。
//已知,結構體Test類型的變量大小是20字節。
//x86環境
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

????????這是一道結構體指針的運算,定義結構體*p,其值設定為0x100000。在x86環境下,進行了三種不同的運算,分析結果。

2.1 答案

????????答案是:00100014? ?00100001? 00100004

2.2 解析

? ? ? ? 對于 p+0x1,是將結構體指針p+1,由于p是結構體指針,所以,其步長為1個結構體的長度,題目說這樣一個結構體長度為20(其實可以通過自己計算結構體的內容得出),所以加1直接跳過20個字節,因此輸出結果為00100014。(16進制20就是14)。

? ? ? ? 對于(unsigned long)p + 0x1,將p強制轉換成了無符號長整型,p已經不再是指針,變成了一個長整型1,048,567。加1變成1,048,568。輸出時用的%p,也就是地址類型的輸出,因此是16進制,1,028,568轉換回16進制就是00100001。

? ? ? ? 對于(unsigned int*)p + 0x1,將p轉化成了無符號整型指針,那其步長就變為了4,p+1就指向4字節后的地址,因此對p+1輸出結果為00100004。

3、案例三

????????

#include <stdio.h>
int main()
{int a[4] = { 1,2,3,4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

? ? ? ?%x代表16進制輸出,來想想這題的答案吧

3.1 答案

? ? ? ? 怎么樣,算對了嗎?

3.2 解析?

? ? ? ? 這道題難點在第二個輸出,下面我們一個個分析:

? ? ? ? 對于ptr1來說,定義時,(int*)(&a + 1);&a取出了整個數組的地址,+1跳過整個數組指向數組最后一個元素后面一個位置的地址,?然后再將它強制類型轉換回(int*)類型,步長變回一個整型數據的大小。輸出時,ptr[-1]其實就是輸出ptr前一個地址的訪問值,ptr前一個地址指向的就是數組最后一個元素,因此輸出為4.

? ? ? ? 對于ptr2來說,定義時,(int*)((int)a + 1);先將a強制轉換成int類型,已經不是指針了,因此+1就是存粹往a上加個1。

? ? ? ? 在內存中a[4]的存放是如上圖的,強制類型轉換后+1指向的其實是如上圖的位置,那么再對其進行解引用得到的就是02000000(因為我們用的編譯器是小端存儲,數據的低位是放在地址的低位的,存儲時反著存,讀取時要反著讀取)

4、案例四

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1),(2, 3),(4, 5) };int* p;p = a[0];printf("%d", p[0]);return 0;
}

4.1 答案

????????

? ? ? ? 答案是1,是不是沒想到

4.2 解析

? ? ? ? 其實這題在初始化是有坑的,仔細看我們在初始化的時候用到了(),我舉個例子:

(0,1)這個式子其實就是1,這是個逗號表達式,逗號表達式的值就是最后一個','后面的那個值,在這里就是1.其實a[3][2]這個數組只初始話了3個值{1 , 3 , 5}。

? ? ? ? 好了,現在再來分析p指針,對于p來講,p=a[0],將a第一行賦值給p其實就是第一行元素的首地址給了p,最后打印時p[0]其實就是訪問a第一行第一個元素的值,相當于a[0][0],最后打印出來就是1。

5、案例五

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

5.1 答案

答案是:FFFFFFFC,-4

5.2 解析

? ? ? ? 這題,p是一個數組指針,其步長為4個整型數據大小,比a數組的每一行長度少1個整型數據大小,p和a一開始指向的是同一個地址,每當p+1時,p只能跳過4個整型數據大小的地址,而對于a來說,a+1可以跳過5個整型數組的大小的地址。所以,p[4][2]和a[4][2]比較,它們都跳過了4行,因此a[4][2]在地址上比p[4][2]多4個整型大小的值,而我們知道,指針和指針相減,得到的是兩個指針之間的元素個數,因此是-4,%p是輸出地址,其沒有原碼反碼補碼的概念,直接將內存中-4的補碼輸出,就是FFFFFFFC。

總結

? ? ? ? 本篇通過五個例子來加強我們對指針和數據存儲的理解,希望對你學習c語言的指針有所幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Google重磅開源!Gemma 2B/7B小模型登場,6萬億Tokens喂飽,聊天編程兩不誤,LLaMA也黯然失色?

Google又有大動作&#xff01; 近日&#xff0c;他們發布了Gemma 2B和7B兩個開源AI模型&#xff0c;與大型封閉模型不同&#xff0c;它們更適合小型任務&#xff0c;如聊天和文本摘要。 這兩個模型在訓練過程中使用了6萬億個Tokens的數據&#xff0c;包括網頁文檔、代碼和數學…

收單外包機構備案2023年回顧和2024年展望

孟凡富 本文原標題為聚合支付深度復盤與展望&#xff0c;首發于《支付百科》公眾號&#xff01; 收單外包服務機構在我國支付收單市場中占據著舉足輕重的地位&#xff0c;其規模在政策引導和市場需求驅動下不斷擴大。同時&#xff0c;隨著行業自律管理體系的持續發展和完善&a…

文獻速遞:GAN醫學影像合成--用生成對抗網絡生成 3D TOF-MRA 體積和分割標簽

文獻速遞&#xff1a;GAN醫學影像合成–用生成對抗網絡生成 3D TOF-MRA 體積和分割標簽 01 文獻速遞介紹 深度學習算法在自然圖像分析中的成功近年來已被應用于醫學成像領域。深度學習方法已被用于自動化各種耗時的手動任務&#xff0c;如醫學圖像的分割和分類&#xff08;G…

頂刊中很出彩的二元變量圖

導師希望你發頂刊, 但你的圖紙差點意思, 那么,你不妨試試這個, 二元變量圖, 在頂刊中都很出彩哦! 本次,我們來以“降水量”和“NDVI”兩個數據為例,繪制二元變量分析圖,表達“降水量”和“NDVI”之間的關系。 什么是二元變量圖 首先還是先解釋下“二元變量圖”。顧…

OpenCV中saturate_cast模板函數

在OpenCV中&#xff0c;saturate_cast是一個模板函數&#xff0c;用于正確地將一個數值從一種類型轉換到另一種類型&#xff0c;同時確保結果在目標類型的有效范圍內。這在圖像處理中特別有用&#xff0c;比如當像素值在經過計算后可能超出其數據類型允許的范圍時。saturate_ca…

-bash: /root/.ssh/authorized_keys: Read-only file system

問題背景 由于跳板機不支持 ssh-copy-id 命令&#xff0c;為了配置免密登錄&#xff0c;考慮在服務器上手動使用 cat 命令寫入跳板機公鑰 cat <<EOL >> ~/.ssh/authorized_keys [Your public key] EOL但卻出現了以下錯誤 -bash: /root/.ssh/authorized_keys: Re…

編程筆記 Golang基礎 013 格式化輸入輸出

編程筆記 Golang基礎 013 格式化輸入輸出 一、格式化輸出1. fmt.Print系列函數2. Printf格式說明3. 格式化布爾類型 二、格式化輸入1. fmt.Scan系列函數注意事項 三、練習小結 Go語言中的格式化輸入和輸出主要通過標準庫 fmt 包來實現。主要是輸出需要格式化。 一、格式化輸出 …

掃盲貼:Svg動畫和Canvas動畫有什么區別

hello&#xff0c;我是貝格前端工場&#xff0c;網頁中動畫的實現有N種方式&#xff0c;比如css動畫&#xff0c;js動畫&#xff0c;svg動畫&#xff0c;canvas動畫等等&#xff0c;每一種動畫都有對應的場景&#xff0c;本問重點介紹一下svg和canvas動畫的異同點&#xff0c;歡…

大工程 從0到1 數據治理 數倉篇(sample database classicmodels _No.7)

大工程 從0到1 數據治理 之數倉篇 我這里還是sample database classicmodels為案列&#xff0c;可以下載&#xff0c;我看 網上還沒有類似的 案列&#xff0c;那就 從 0-1開始吧&#xff01; 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參…

TRS 2024 論文閱讀 | 基于點云處理和點Transformer網絡的人體活動連續識別

無線感知/雷達成像部分最新工作<持續更新>: 鏈接地址 注1:本文系“無線感知論文速遞”系列之一,致力于簡潔清晰完整地介紹、解讀無線感知領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷達學…

提高代碼質量的 10 條編碼原則

提高代碼質量的 10 條編碼原則 本文轉自 公眾號 ByteByteGo&#xff0c;如有侵權&#xff0c;請聯系&#xff0c;立即刪除 今天來聊聊提高代碼質量的 10 條編碼原則。 軟件開發需要良好的系統設計和編碼標準。我們在下圖中列出了 10 條良好的編碼原則。 01 遵循代碼規范 我們…

Studio One破解版和正版的區別 Studio One購買是永久的嗎

在過去的很長一段時間里&#xff0c;很多小伙伴想要使用一款軟件時&#xff0c;可能第一時間就去網上尋找破解版的資源&#xff0c; 白嫖的資源固然很香&#xff0c;但隨著法制的健全和人們版權意識的增強&#xff0c;現在破解版的資源是越來越少了。同時破解版的資源也會伴隨著…

大數據計算技術秘史(上篇)

在之前的文章《2024 年&#xff0c;一個大數據從業者決定……》《存儲技術背后的那些事兒》中&#xff0c;我們粗略地回顧了大數據領域的存儲技術。在解決了「數據怎么存」之后&#xff0c;下一步就是解決「數據怎么用」的問題。 其實在大數據技術興起之前&#xff0c;對于用戶…

react實現拖拽的插件

插件一&#xff1a;dnd-kit 插件官網鏈接https://docs.dndkit.com/introduction/installation 插件二&#xff1a;react-beautiful-dnd https://github.com/atlassian/react-beautiful-dnd/tree/master 兩個插件的區別&#xff1a; 插件一可以做到從區域A拖住到區域B 插件二…

平臺組成-門戶服務

整體是從用戶視角&#xff0c;從外往內介紹。前面講了平臺的幾個模塊&#xff08;就是前端部署包&#xff09;。今天開始介紹后臺服務&#xff08;微服務&#xff0c;SpringCloud&#xff0c;通過-jar 參數啟動的jar包&#xff09;。 門戶服務完成登錄、注冊、界面配置、功能鏈…

java面試JVM虛擬機篇

1 JVM組成 1.1 JVM由那些部分組成&#xff0c;運行流程是什么&#xff1f; 難易程度&#xff1a;☆☆☆ 出現頻率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的運行環境&#xff08;java二進制字節碼的運行環境&#xff09; 好處&#xff1a; 一次編寫&a…

Go 原子操作有哪些?

Go atomic包是最輕量級的鎖&#xff08;也稱無鎖結構&#xff09;&#xff0c;可以在不形成臨界區和創建互斥量的情況下完成并發安全的值替換操作&#xff0c;不過這個包只支持int32/int64/uint32/uint64/uintptr這幾種數據類型的一些基礎操作&#xff08;增減、交換、載入、存…

Excel之index、MATCH面試題、VLOOKUP函數,

VLOOKUP() 在表格的首列查找指定的數值&#xff0c;并返回表格當前行中指定列處的數值。 結構&#xff1a;VLOOKUP(查找值,查找區域,列序數,匹配條件) 解釋&#xff1a;VLOOKUP(找誰,在哪里找,第幾列,0或1) 1.目的&#xff1a;根據【產品】查找【銷量】 公式&#xff1a;V…

pikachu靶場-XSS

XSS&#xff1a; XSS&#xff08;跨站腳本&#xff09;概述 Cross-Site Scripting 簡稱為“CSS”&#xff0c;為避免與前端疊成樣式表的縮寫"CSS"沖突&#xff0c;故又稱XSS。一般XSS可以分為如下幾種常見類型&#xff1a; 1.反射性XSS; 2.存儲型XSS; 3.DOM型XSS; …

QT的UI入門

二、UI入門 QWidget類&#xff08;熟悉&#xff09; QWidget類是所有組件和窗口的基類&#xff0c;內部包含了一些基礎的界面特性。 常用屬性&#xff1a; 修改坐標 x : const int 橫坐標&#xff0c;每個圖形的左上角為定位點&#xff0c;橫軸的零點在屏幕的最左邊&#xff0c…