【c語言】指針和數組筆試題解析

?? ?一維數組:

//數組名a如果既不單獨放在sizeof()中,也不與&結合,那么就表示數組首元素的大小
//a一般表示數組首元素地址,只有兩種情況表示整個數組,sizeof(arr)表示整個數組的大小,&arr表示數組的地址
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));//注意:此時a是首元素地址;結果:4/8
printf("%d\n", sizeof(*a));//4
printf("%d\n", sizeof(a + 1));//注意:此時a是第二個元素地址;結果:4/8
printf("%d\n", sizeof(a[1]));//4
printf("%d\n", sizeof(&a));//4/8 注意:是地址
printf("%d\n", sizeof(*&a));//16 注意:&a是數組指針,對數組指針解引用訪問一個數組的大小
printf("%d\n", sizeof(&a + 1));//4/8
printf("%d\n", sizeof(&a[0]));//4/8
printf("%d\n", sizeof(&a[0] + 1));//4/8

字符數組:

char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
printf("%d\n", strlen(arr));//隨機數
printf("%d\n", strlen(arr + 0));//隨機數
//printf("%d\n", strlen(*arr));//err
//printf("%d\n", strlen(arr[1]));//err
//arr是首元素的地址,*arr就是首元素,站在strlen的角度,認為傳參進去的'a'-97就是地址,97作為地址直接進行訪問就是非法訪問
//strlen不能傳元素,只能傳地址
printf("%d\n", strlen(&arr));//隨機數
printf("%d\n", strlen(&arr + 1));//隨機數
printf("%d\n", strlen(&arr[0] + 1));//隨機數
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 注意:sizeof()計算字符串大小,有'\0'是需要計算'\0'
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr + 1));//隨機數 注意:&arr+1跳過整個數組,指向的位置何時出現'\0'未知
printf("%d\n", strlen(&arr[0] + 1));//5
char* p = "abcdef";
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(p + 1));//4/8
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4/8
printf("%d\n", sizeof(&p + 1));//4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//隨機數
printf("%d\n", strlen(&p + 1));//隨機數
printf("%d\n", strlen(&p[0] + 1));//5
//注意:p,p+1,&p[0]是地址(指針),p[0]是元素,&p,&p+1是二級指針,strlen()中存放指針,計算該指針指向的對象'\0'前的元素個數;如果是二級指針,則計算指向的一級指針'\0'前的元素個數,未知!

二維數組:

//注意:二維數組是一維數組的數組,這個思想非常重要
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//16 注意:a[0]是第一行這個一維數組的數組名,數組名單獨放在了sizeof內部,計算整個一維數組的大小
printf("%d\n", sizeof(a[0] + 1));//4/8 注意:a[0]是一維數組的數組名,沒有單獨放在sizeof中,表示一維數組首元素的地址,+1表示第二個元素的地址
printf("%d\n", sizeof(*(a[0] + 1)));//4 第一行的一維數組的第二個元素
printf("%d\n", sizeof(a + 1));//4/8
printf("%d\n", sizeof(*(a + 1)));//16 第二行大小
printf("%d\n", sizeof(&a[0] + 1));//4/8 第二行一維數組的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16 第二行一維數組的大小
printf("%d\n", sizeof(*a));//16  第一行的大小
printf("%d\n", sizeof(a[3]));//16 
//注意:不會越界,sizeof()中一旦有表達式,就能夠確定類型,sizeof(表達式)在編譯器編譯時就能根據類型計算大小,不需要sizeof真的訪問a
//a[3]==a[0]
//int[4]==int[4]
//表達式有兩個屬性:類型屬性,值屬性
//sizeof使用的是表達式的類型屬性

指針練習題:

練習1:

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
//程序的結果是什么?
// 2 5

練習2:

#include <stdio.h>
//由于還沒學習結構體,這里告知結構體的大小是20個字節
//x86環境下演示
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假設p 的值為0x100000。 如下表表達式的值分別為多少?
//已知,結構體Test類型的變量大小是20個字節
int main()
{p = (struct Test*)0x100000;printf("%p\n", p + 0x1);//注意:0x1是16進制,實際上就是1;結構體指針+1,就是跳過一個結構體(20個字節);p是16進制,20的16進制是14,結果:00100014//x86環境下,32位地址,地址大小是4字節,16進制打印有8位printf("%p\n", (unsigned long)p + 0x1);//將地址強轉為整型,整型加1就是加1,以%p格式打印,結果:00100001printf("%p\n", (unsigned int*)p + 0x1);//結果:00100004//注意:以%p格式打印時,前面的0不省略return 0;
}

練習3:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);//元素:小端存儲:01 00 00 00,02 00 00 00//首元素地址強轉為整型int后+1,再強轉為int*,表示地址向后跳過一個字節//指向的元素在內存中為00 00 00 02,實際為02000000(16進制)//以%x格式打印,前面的0可以省略printf("%x,%x", ptr1[-1], *ptr2);//4 2000000return 0;
}

練習4:

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };//逗號表達式//                1       3        5//a[3][2]={{1,3},{5,0},{0,0}};int* p;p = a[0];//數組名表示首元素地址,p==&a[0][0]printf("%d", p[0]);//p[0]==*(p+0)==*p==a[0][0]//1return 0;
}

練習5:

#include <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;//a-int (*)[5]//p-int (*)[4]//注意:類型不同的指針訪問數組的方式不同printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//FFFFFFFC,-4return 0;
}

指針相減得到兩指針間的元素個數且數組在內存中從低地址向高地址存儲:&p[4][2]-&a[4][2]=-4

-4:

原碼:10000000000000000000000000000100

反碼:1111111111111111111111111111111111011

補碼:1111111111111111111111111111111111100(內存中存儲)

以%p格式打印:補碼即地址(x82—32位—4字節—8個十六進制位):FFFFFFFC

以%d格式打印:-4

練習6:?

#include <stdio.h>
int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1);int* ptr2 = (int*)(*(aa + 1));//*(aa + 1)==aa[1]==第二行一維數組首元素的地址(注意這個重要變換)/首元素的地址本身就是整型指針,int*強轉是迷惑printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5return 0;
}

練習7:

#include <stdio.h>
int main()
{char* a[] = { "work","at","alibaba" };//字符指針數組:a的元素時字符指針,分別指向"work","at","alibaba"的首個字符char** pa = a;pa++;printf("%s\n", *pa);//atreturn 0;
}

練習8:?

#include <stdio.h>
int main()
{char* c[] = { "ENTER","NEW","POINT","FIRST" };char** cp[] = { c + 3,c + 2,c + 1,c };char*** cpp = cp;printf("%s\n", **++cpp);//注意:前置后置++/--的優先級都高于解引用//地址++,即指向的元素跳過一個//解引用得到c+2,指向c[2],再解引用得到c+2指向的元素,即POINTprintf("%s\n", *-- * ++cpp + 3);//關系運算符的優先級低于解引用和自增操作符//++cp是在上一個cp的前提下++//解引用得到c+1,自減操作得到c,再解引用得到c指向的元素ENTER,+3向后移3個字符,得到ERprintf("%s\n", *cpp[-2] + 3);//*cpp[-2]==*(*(cp-2))==FIRST,+3得到ST//注意:cp-2,cp的值不變printf("%s\n", cpp[-1][-1] + 1);//cpp[-1][-1]==*(*(cpp-1)-1)==ENTER//+1得到EWreturn 0;
}

結果:

POINT
ER
ST
EW?

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

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

相關文章

機器人進階---視覺算法(六)傅里葉變換在圖像處理中怎么用

傅里葉變換在圖像處理中怎么用 傅里葉變換的基本原理應用場景Python代碼示例逐行解釋總結傅里葉變換在圖像處理中是一種重要的工具,它將圖像從空間域轉換到頻域,從而可以對圖像的頻率特性進行分析和處理。傅里葉變換在圖像濾波、圖像增強、圖像壓縮和圖像分析等方面都有廣泛應…

深度學習與總結JVM專輯(七):垃圾回收器—CMS(圖文+代碼)

CMS垃圾收集器深度解析教程 1. 前言&#xff1a;為什么需要CMS&#xff1f;2. CMS 工作原理&#xff1a;一場與時間的賽跑2.1. 初始標記&#xff08;Initial Mark&#xff09;2.2. 并發標記&#xff08;Concurrent Mark&#xff09;2.3. 重新標記&#xff08;Remark&#xff09…

數據采集:AI 發展的基石與驅動力

人工智能&#xff08;AI&#xff09;無疑是最具變革性的技術力量之一&#xff0c;正以驚人的速度重塑著各行各業的格局。從智能語音助手到自動駕駛汽車&#xff0c;從精準的醫療診斷到個性化的推薦系統&#xff0c;AI 的廣泛應用已深刻融入人們的日常生活與工作的各個層面。而在…

從信息泄露到內網控制

0x01 背景 之前常見用rce、文件上傳等漏洞獲取webshell&#xff0c;偶然遇到一次敏感信息泄露獲取權限的滲透&#xff0c;簡單記錄一下過程。 0x02 信息泄露 發現系統某端口部署了minio服務&#xff0c;經過探測發現存在minio存儲桶遍歷 使用利用工具把泄露的文件全部整理一…

《門》凡是過往,皆為序曲。我們的愛,和最初一樣

《門》凡是過往&#xff0c;皆為序曲。我們的愛&#xff0c;和最初一樣 夏目漱石&#xff0c;本名夏目金之助&#xff0c;筆名漱石&#xff0c;日本近代作家&#xff0c;代表作有《三四郎》《門》《從此以后》《我是貓》《心》《明暗》等。 竺家榮 譯 文章目錄 《門》凡是過往&…

衡石ChatBI:依托開放架構構建技術驅動的差異化數據服務

在當今數字化浪潮中&#xff0c;企業對數據價值的挖掘和利用需求日益增長。BI&#xff08;商業智能&#xff09;工具作為企業獲取數據洞察的關鍵手段&#xff0c;其技術架構的創新與發展至關重要。衡石科技的Chat BI憑借其獨特的開放架構&#xff0c;在BI領域脫穎而出&#xff…

oracle中錯誤總結

oracle中給表起別名不能用as&#xff0c;用as報錯 在 Oracle 數據庫中&#xff0c;??WITH 子句&#xff08;即 CTE&#xff0c;公共表表達式&#xff09;允許后續定義的子查詢引用前面已經定義的 CTE??&#xff0c;但 ??前面的 CTE 無法引用后面的 CTE??。這種設計類似…

NLP高頻面試題(五十)——大模型(LLMs)分詞(Tokenizer)詳解

在自然語言處理(NLP)任務中,將文本轉換為模型可處理的數字序列是必不可少的一步。這一步通常稱為分詞(tokenization),即把原始文本拆分成一個個詞元(token)。對于**大型語言模型(LLM,Large Language Model,大型語言模型)**而言,選擇合適的分詞方案至關重要:分詞的…

優化WAV音頻文件

優化 WAV 音頻文件通常涉及 減小文件體積、提升音質 或 適配特定用途&#xff08;如流媒體、廣播等&#xff09;。以下是分場景的優化方法&#xff0c;涵蓋工具和操作步驟&#xff1a; 一、減小文件體積&#xff08;無損/有損壓縮&#xff09; 1. 無損壓縮 轉換格式&#xff1…

ORACLE SQL輸入的變量由于隱式轉換無法使用索引的分析優化

近期&#xff0c;某客戶在巡檢分析AWR報告時&#xff0c;發現有個TOP SQL的執行效率偏慢&#xff0c;檢查分析SQL&#xff0c;發現數據塊讀取量高&#xff0c;分析執行計劃&#xff0c;發現有個查詢條件未使用到索引&#xff1b; 對執行計劃及表上的字段、索引進行分析&#x…

【鋰電池SOH估計】RF隨機森林鋰電池健康狀態估計,鋰電池SOH估計(Matlab完整源碼和數據)

目錄 效果一覽程序獲取程序內容代碼分享研究內容基于隨機森林(RF)的鋰電池健康狀態(SOH)估計算法研究摘要1. 引言2. 鋰電池SOH評估框架3. 實驗與結果分析4. 未來研究方向6. 結論效果一覽 程序獲取 獲取方式一:文章頂部資源處直接下載:【鋰電池SOH估計】RF隨機森林鋰電池…

安全高效兩不誤,這款安全數據擺渡系統支持8種傳輸協議

安全高效兩不誤&#xff01;這款安全數據擺渡系統支持8種傳輸協議 傳統的安全數據擺渡系統主要包括物理介質拷貝&#xff08;如光盤、U盤&#xff09;、網閘、光閘、防火墻文件交換模塊等&#xff0c;這些安全數據擺渡系統和傳輸方式在傳輸協議支持及功能實現上各有優劣勢。 …

(51單片機)LCD顯示溫度(DS18B20教程)(LCD1602教程)(延時函數教程)(單總線教程)

演示視頻&#xff1a; LCD顯示溫度 源代碼 如上圖將9個文放在Keli5 中即可&#xff0c;然后燒錄在單片機中就行了 燒錄軟件用的是STC-ISP&#xff0c;不知道怎么安裝的可以去看江科大的視頻&#xff1a; 【51單片機入門教程-2020版 程序全程純手打 從零開始入門】https://www.…

【愚公系列】《Python網絡爬蟲從入門到精通》063-項目實戰電商數據偵探(主窗體的數據展示)

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

日志分析工具快速統計電商系統單位時間內的請求總數

一、常用日志分析工具及操作步驟 ?ELK Stack(Elasticsearch + Logstash + Kibana)?核心操作? 日志收集?:通過Logstash配置日志輸入(如Nginx日志文件),使用grok插件解析日志格式。 數據存儲?:將解析后的日志存入Elasticsearch,利用其分布式搜索能力快速索引數據。…

Win10一體機(MES電腦設置上電自動開機)

找個鍵盤&#xff0c;帶線的那種&#xff0c;插到電腦上&#xff0c;電腦開機&#xff1b;連續點按F11&#xff1b;通過↑↓鍵選擇Enter Setup 然后回車&#xff1b; 選擇 smart settings &#xff1b; 選擇 Restore AC Power Loss By IO 回車&#xff1b; 將prower off 改為…

crontab 定時備份 mysql 數據庫

1、使用 mysqldump 命令備份數據 1.1 備份全部數據庫的數據和結構 mysqldump -uroot -p123456 -A > /data/backup/db.sql1.2 備份全部數據庫的結構&#xff08;加 -d 參數&#xff09; mysqldump -uroot -p123456 -A -d > /data/backup/db.sql1.3 備份全部數據庫的數據…

【Git】branch合并分支

在 Git 中&#xff0c;將分支合并到 main 分支是一個常見的操作。以下是詳細的步驟和說明&#xff0c;幫助你完成這個過程。 1. 確保你在正確的分支上 首先&#xff0c;你需要確保當前所在的分支是 main 分支&#xff08;或者你要合并到的目標分支&#xff09;。 檢查當前分支…

基于Python+Pytest實現自動化測試(全棧實戰指南)

目錄 第一篇&#xff1a;基礎篇 第1章 自動化測試概述 1.1 什么是自動化測試 第2章 環境搭建與工具鏈配置 2.1 Python環境安裝&#xff08;Windows/macOS/Linux&#xff09; 2.2 虛擬環境管理 2.3 Pytest基礎配置&#xff08;pytest.ini&#xff09; 第3章 Pytest核心語…

什么是CRM系統,它的作用是什么?CRM全面指南

CRM&#xff08;Customer Relationship Management&#xff0c;客戶關系管理&#xff09;系統是一種專門用于集中管理客戶信息、優化銷售流程、提升客戶滿意度、支持精準營銷、驅動數據分析決策、加強跨部門協同、提升客戶生命周期價值的業務系統工具。其中&#xff0c;優化銷售…