指針和數組簡單填空題合集(純刷題:60道)

前言

本篇文章適合初學指針和數組的朋友,如果您看了前幾組題覺得很簡單,可以看一看我的另一篇文章。

通過本篇文章,你可以清晰的區分出strlen和sizeof的區別,(題目類型包括一維數組、二維數組)并提高自己做這類題熟練度,題目有點多,建議分成兩到三次做,下面讓我們開始吧。

小建議:先自己做再對答案,不明白可以看解析,如果你趕時間可以看我注釋掉的題目,那些是我認為比較容易出錯的

一維數組

題目1組

int main()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a + 0)); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(a[1]));printf("%d\n", sizeof(&a)); printf("%d\n", sizeof(*&a));printf("%d\n", sizeof(&a + 1)); printf("%d\n", sizeof(&a[0])); printf("%d\n", sizeof(&a[0] + 1)); return 0;
}

答案

16
4/8
4
4/8
4
4/8
16
4/8
4/8
4/8

解析

說明:題號表示對應的題目

1.計算數組總大小,單位是字節,四個int類型的元素,加在一起就是16個字節

2.a+0此時已經不是數組名了,所以大小是4 補充說明: 只有當&數組名和sizeof(數組名)中的數組名才表示整個數組3.a是首元素地址,*a就是首元素,*a = 1,整型,大小是44.a+1類似于a+05.a[1] 是第二個元素6.&a取出數組地址,但數組地址也是一個地址,而地址的大小在32位平臺上就是4個字節7.*&a,取出數組的地址再解引用,等于沒有變化。一個數組的地址解引用等于訪問一個數組8.&a取出數組的地址,+1跳過了整個數組,但它本質上還是一個地址,所以大小是49.第一個元素的地址,地址大小是4/810.第二個元素的地址,地址大小是4/8

題目2組

#include <string.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr + 0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr + 1)); printf("%d\n", sizeof(&arr[0] + 1)); return 0;
}

答案:

6
4/8
1
1
4/8
4/8
4/8

解析

1.計算的是數組大小,單位是字節

2.此處的arr是首元素地址,大小是4/8

3.解引用之后,是字符a,大小是1

4.第二個元素

5.&arr 是數組的地址,大小是4/8

6.&arr+1跳過一個數組,仍是一個地址,大小是4/8

7.計算完是第二個元素的地址,大小是4/8個字節

題目3組

#include <string.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr + 0)); //printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr + 1));printf("%d\n", strlen(&arr[0] + 1)); return 0;
}

答案

隨機值
隨機值
錯誤?
錯誤?
隨機值
隨機值
隨機值

解析

1.strlen遇到\0停止讀取,arr中無\0,所以輸出的是隨機值

2.arr+0還是arr,結果仍然是隨機值

3.

*arr是第一個元素,字符a,而字符a的ascii碼值是97,相當于將97傳給strlen,但strlen要求傳入的是地址,所以他就認為97是地址,strlen函數就訪問97這個地址,我們并不知道在地址97處存儲的究竟是什么,所以我們也不知道輸出結果是什么。在運行的時候程序會直接崩潰(一般是非法訪問)(此處不做過多解釋,如果看不懂,可以私信我(但這是作者能解釋得最清楚的程度了))

4.arr[1]是第二個元素,字符b,類似于上一題,同樣是錯誤的

5.此處傳入的是數組arr的地址,那么傳入之后,strlen同樣從‘a’開始讀取,arr末尾沒有\0,所以輸出隨機值

6.從’f’后開始讀取,遇到隨機的\0之后停止讀取
提示:這題的結果與上一題一起運行時,上面的結果比下面的大6

7.從字符b開始讀取,數組末尾沒有\0,結果是隨機值

題目4組

int main()
{char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr + 0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr + 1)); printf("%d\n", sizeof(&arr[0] + 1)); return 0;
}

答案

7
4/8
1
1
4/8
4/8
4/8

解析

1.數組在初始化時包含\0,所以大小是7

2.arr+0,是首元素地址,大小是4/8

3.*arr,指向第一個元素,是字符類型,大小是1

4.第二個元素,字符類型,大小是1

5.&arr,是數組的地址,是地址,大小是4/8

6.&arr+1,仍然是地址,大小是4/8

7.指向第二個元素,是地址,大小是4/8

題目5組

int main()
{char arr[] = "abcdef"; printf("%d\n", strlen(arr));printf("%d\n", strlen(arr + 0)); printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr + 1)); printf("%d\n", strlen(&arr[0] + 1)); return 0;
}

答案

6
6
錯誤
錯誤
6
隨機值
5

解析

1.strlen遇到\0停止讀取,\0不算在內,\0之前有6個元素,所以輸出結果是6

2.arr+0,是首元素的地址,數組中有\0,所以結果是6

3.*arr是第一個元素,字符a,類似于上一組題中的第三題,都是傳參類型出錯,導致非法訪問內存

4.傳的是第二個元素,同樣是非法訪問

5.

從第一個地址開始訪問,到\0停止訪問,\0之前共有六個元素.
提示:數組的地址應存入數組指針型變量里,寫成char(*p) = &arr;

而strlen的參數是const char*
此處會報警告,但是也可以強制運行

6.&arr+1,跳過arr數組,也跳過了數組里面的\0,所以結果是隨機值

7.&arr[0] + 1,取出第一個元素的地址再加一,此時指向數組里的第二個元素,
從第二個元素到\0之前有5個元素,所以輸出結果是5

題目6組

int main()
{const char* p = "abcdef"; printf("%d\n", sizeof(p));printf("%d\n", sizeof(p + 1)); printf("%d\n", sizeof(*p)); //printf("%d\n", sizeof(p[0])); printf("%d\n", sizeof(&p)); printf("%d\n", sizeof(&p + 1));  //printf("%d\n", sizeof(&p[0] + 1)); return 0;
}

答案

4/8
4/8
1
1
4/8
4/8
4/8

解析

//先做一個簡單的解釋說明,p中存儲的是第一個字符的地址

1.p是指針變量,p中存儲的是地址,大小是4/8

2.p+1,得到的是第二個元素的地址,仍然是地址,所以大小是4/8

3.對p進行解引用,就是第一個字符,字符a,是字符類型,大小是1

4.

p[0],指的就是第一個元素,字符a,大小是1
補充說明:之前有講過:數組名arr指的就是首元素的地址,那么就有下面這個等式:arr[0] == *(arr+0),

而p同樣是首元素的地址,所以此處就相當于p[0] == *(p+0),即第一個元素

5.取出p的地址,是地址,地址大小是4/8

6.取出數組的地址,再加一,跳過整個數組,得到一個地址,是地址,地址大小是4/8

7.

看起來比較復雜,拆開來看,p[0]就是p,存的是第一個元素的地址,&p[0],就是取出第一個元素的地址,再加一,得到第二個元素的地址,是地址,地址大小是4/8

題目7組

int main()
{const char* p = "abcdef";printf("%d\n", strlen(p)); printf("%d\n", strlen(p + 1)); printf("%d\n", strlen(*p)); printf("%d\n", strlen(p[0])); printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p + 1)); printf("%d\n", strlen(&p[0] + 1)); return 0;
}

答案

6
5
錯誤
錯誤
隨機值
隨機值
5

解析

1.傳入p,p中存儲的是第一個元素的地址,傳入strlen函數,輸出元素個數:6

2.p+1,相當于&p[1],是第二個元素的地址,輸出結果為5

3.*p傳入的是a,直接報錯

4.p[0]就是*p,程序報錯

5.p中存儲的是a的地址,取出指針變量p的地址,從變量p的地址處向后讀取,而不是在字符串內讀取,所以結果是隨機值

6.同樣是隨機值

7.相當于p[1],是第二個元素的地址,結果是5

二維數組

題目

int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a[0][0])); printf("%d\n", sizeof(a[0])); printf("%d\n", sizeof(a[0] + 1)); printf("%d\n", sizeof(*(a[0] + 1))); //printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(*(a + 1))); //printf("%d\n", sizeof(&a[0] + 1));printf("%d\n", sizeof(*(&a[0] + 1)));  printf("%d\n", sizeof(*a)); //printf("%d\n", sizeof(a[3])); return 0;
}

答案

48
4
16
4
4
4/8
16
4/8
16
16
16

解析

//簡單解釋:三行四列的二維數組
1.數組里有12個元素,大小是48個字節

2.第一個元素,是int類型,大小是4

3.指的是第一行元素,四個元素,大小是16
補充說明:可以認為該二維數組有三個元素,一行是一個元素,那么a[0]相當于第一行元素的數組名,也就是第一行的元素

4.上面提到a[0]是第一行元素的數組名,那么+1,指向的就是第一行的第二個元素,是int類型,大小是4個字節
補充說明:只有當數組名單獨的放在sizeof內部時,數組名才是整個數組

5.對于第一行第二個元素的地址進行解引用,結果就是第二個元素,是int類型,大小是4

6.

a+1是地址,是指向第二行元素的地址,大小是4/8
解釋說明:二維數組的數組名是首元素的地址,即第一行元素的地址,那么與整數運算時,單位是第一行元素的大小,所以指向的是第二行元素

7.第二行的地址解引用,是第二行元素,是四個int型,大小是16

8.

第二行的地址,是地址,地址大小是4/8
解釋說明:a[0]就相當于第一行的數組名,數組名取地址,取出第一行的地址,再加一,得到第二行的地址

9.第二行的地址進行解引用,得到第二行四個int型的數據,大小是16

10.a是數組首元素地址,即第一行地址,解引用后得到第一行四個int類型的數據,大小是16

11.

a[3],類似于a[0],放入的是具有四個int類型的一維數組,大小是16
補充說明:sizeof中的表達式不參與真實運算,所以他并不會去訪問第四行,這道題只是將a[3]放入其中,這類似于放入a[0]

小提示

做這類題,首先要明確數組名在這里究竟代表什么,是首元素地址?還是數組地址,之后再去運算就會方便一些

結語

刷題到這里就結束了,下一篇文章我會整理一些指針的面試題,來幫助大家更好的理解指針。
我們下篇文章見~

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

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

相關文章

Linux NTP原理及配置使用

一、NTP簡介 1.NTP簡介 NTP&#xff08;Network Time Protocol&#xff0c;網絡時間協議&#xff09;是用來使網絡中的各個計算機時間同步的一種協議。它的用途是把計算機的時鐘同步到世界協調時UTC&#xff0c;其精度在局域網內可達0.1ms&#xff0c;在互聯網上絕大多數的…

CSS自學框架之動畫

這一節&#xff0c;自學CSS動畫。主要學習了淡入淡出、淡入縮放、縮放、移動、旋轉動畫效果。先看一下成果。 優雅的過渡動畫&#xff0c;為你的頁面添加另一份趣味&#xff01; 在你的選擇器里插入 animation 屬性&#xff0c;并添加框架內置的 keyframes 即可實現&#xff0…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多從)》

一、架構圖 如下圖所示: 二、環境信息 1、部署規劃 主機名K8S版本系統版本內核版本IP地址備注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master節點 + etcd節點k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master節點 + …

【抖音直播小玩法】介紹

一、是什么 直播小玩法是基于抖音直播場景的新型實時互動內容。直播小玩法由開發者自主開發&#xff0c;接入平臺并開放給抖音主播掛載使用。開發者提供創意&#xff0c;依托平臺生態&#xff0c;獲取收益。 介入標準&#xff1a; 企業開發者&#xff0c;暫不支持個人開發者…

DAMO-YOLO:實時目標檢測設計的報告

ReadPaperhttps://readpaper.com/pdf-annotate/note?pdfId4748421678288076801eId1920373270663763712 Abstract 在本報告中&#xff0c;我們提出了一種快速準確的目標檢測方法&#xff0c;稱為DAMO-YOLO&#xff0c;它比最先進的YOLO系列實現了更高的性能。DAMO-YOLO 通過…

C++ Primer Plus: 第10章(2)

第10章編程題&#xff1a; &#xff08;1&#xff09; Account.h: #ifndef ACCOUNT_H_ #define ACCOUNT_H_#include <string>class Account { private:std::string name ;std::string code ;double money ; public:Account() ;Account(std::string Name, std::string Co…

Vue history和hash模式

目錄 一、簡介 一、簡介 ~~~~~~~~ 在Vue.js中&#xff0c;路由模式是用來管理應用程序中不同頁面之間的導航的機制。Vue Router支持兩種常見的路由模式&#xff1a;history模式和hash模式。 History 模式&#xff1a; ~~~~~~~~ History模式使用瀏覽器的history.pushState API …

紅帆OA SQL注入漏洞復現

0x01 產品簡介 紅帆iOffice.net從最早滿足醫院行政辦公需求&#xff08;傳統OA&#xff09;&#xff0c;到目前融合了衛生主管部門的管理規范和眾多行業特色應用&#xff0c;是目前唯一定位于解決醫院綜合業務管理的軟件&#xff0c;是最符合醫院行業特點的醫院綜合業務管理平…

Lnton羚通關于如何使用nanoPC-T4 安裝OpenCV?

nanoPC-T4 安裝 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…

springboot 自定義注解

1、引入maven依賴&#xff08;版本太低也會導致不生效&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.7.10</version></dependency…

深度分析納斯達克上市公司慧擇的競爭優勢和投資價值

來源&#xff1a;猛獸財經 作者&#xff1a;猛獸財經 一、保險行業的現狀、競爭與機遇 在疫情期間&#xff0c;很多行業的經營理念與經營方式&#xff0c;甚至客戶行為、客戶需求都發生了變化&#xff0c;進而催生出新的機遇。保險行業亦是如此&#xff0c;受疫情影響&#xf…

用Python編程實現百度自然語言處理接口的對接,助力你開發智能化處理程序

用Python編程實現百度自然語言處理接口的對接&#xff0c;助力你開發智能化處理程序 隨著人工智能的不斷進步&#xff0c;自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;成為了解決文本處理問題的重要工具。百度自然語言處理接口提供了一系…

騰訊開啟2024校招,主要招聘5大類崗位

近日&#xff0c;騰訊的大動作一個接一個&#xff0c;前腳剛公布2023上半年財報&#xff0c;后腳就開啟了2024校招&#xff0c;不得不讓人感嘆騰訊真速度&#xff01; 此次招聘對象為畢業時間在2023年9月至2024年8月期間的2024屆應屆畢業生&#xff0c;覆蓋北上廣深等多個城市…

異步編程框架Seastar介紹

使用Seastar進行異步(Asynchronout)編程 介紹 我們在本文中介紹的Seastar&#xff0c;是一個用于在現代多核機器上&#xff0c;編寫高效復雜的服務器應用程序的C庫。 傳統上&#xff0c;用于編寫服務器應用程序的編程語言庫和框架已經分為兩個不同的陣營&#xff1a;那些注重…

環境與能源創新專題:地級市綠色創新、碳排放與環境規制數據

數據簡介&#xff1a;推動綠色發展&#xff0c;促進人與自然和諧共生是重大戰略舉措。綠色發展強調“綠水青山就是金山銀山”&#xff0c;人與自然和諧共生重在正確處理生態環境保護與經濟發展的關系。在著力于實現綠色發展的過程中&#xff0c;綠色創新是綠色發展的重要驅動因…

關于API數據接口獲取商品的數據的說明

獲取商品數據已經成為許多應用程序的重要組成部分。為了實現這一目標&#xff0c;許多公司和技術開發者使用API數據接口來獲取相關數據。本文將詳細介紹如何使用API數據接口獲取商品數據&#xff0c;并使用Python作為編程語言示例來展示相關代碼。 API數據接口是一種通信協議&…

WPF的CheckBox中的三個狀態

WPF的CheckBox中的三個狀態 CheckBox控件和RadioButton控件是繼承自ToggleButton類&#xff0c;這意味著用戶可切換他們的開關狀態&#xff0c;其中IsChecked屬性是可空的Boolean類型&#xff0c;這意味著該屬性可以設置為true&#xff0c;false或null。 null值表示不確定狀態…

spring.HttpMessageNotReadableException: JSON parse error

實體類如下&#xff1a; Value public class Search{//搜索內容String value;//是否模糊搜索boolean fuzzy true; //其實這樣寫并不是“默認”模糊搜索&#xff0c;而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…

GPU Microarch 學習筆記 [1]

WARP GPU的線程從thread grid 到thread block&#xff0c;一個thread block在CUDA Core上執行時&#xff0c;會分成warp執行&#xff0c;warp的顆粒度是32個線程。比如一個thread block可能有1024個線程&#xff0c;分成32個warp執行。 上圖的CTA&#xff08;cooperative thre…

10條SQL優化技巧

一、一些常見的SQL實踐 &#xff08;1&#xff09;負向條件查詢不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好習慣 可以優化為in查詢&#xff1a; select * from order where status in(2,3) &#xff08;2&#xff09;前導模…