C語言——深入理解指針(四)

C語言——深入理解指針(四)

數組名的意義

  • sizeof(數組名),且數組名單獨放在sizeof內部,則這里的數組名表示整個數組,計算的是整個數組的大小
  • &數組名,這里的數組名表示的是整個數組,取出的是整個數組的地址
  • 除此之外所有的數組名都表示首元素的地址

sizeof和strlen的比較

1.sizeof是操作符,用于計算變量所占內存大小(不關注內存中存放什么數據),單位是字節
在這里插入圖片描述
2.strlen是庫函數(需要包含頭文件<string.h>),求字符串長度。其統計的是從strlen函數的參數str中這個地址開始向后,\0之前字符串中字符的個數。函數原型:

size_t strlen (const char* str)//返回類型注意為size_t

在這里插入圖片描述
但若沒有\0,就可能會存在越界查找,結果就是一個隨機數,如下圖所示:
在這里插入圖片描述
3.比較
在這里插入圖片描述

實例:

(一)一維數組

這里千萬要注意前面提到的數組名的意義

#include<stdio.h>
int main()
{int a[] = { 1,2,3,4 };
printf("%zu\n", sizeof(a));//16
//a單獨在sizeof里面代表整個數組,即四個元素乘以它們的類型所占字節
printf("%zu\n", sizeof(a+0));//4/8
//a沒有單獨在里面,所以代表首元素的地址,那么a+0還是首元素的地址,這里計算的是一個地址的大小不同環境有差別
printf("%zu\n", sizeof(*a));//4
//這里a沒有單獨放在sizeof內,a就是首元素地址,*a就是首元素1
printf("%zu\n", sizeof(a+1));//4/8
//a是首元素的地址,a+1就是第二個元素的地址
printf("%zu\n", sizeof(a[1]));//4
//第二個元素
printf("%zu\n", sizeof(&a));//4/8
//&a取出的是數組的地址,數組的地址也是地址
printf("%zu\n", sizeof(*&a));//16
//&a取出的是數組的地址,它的類型為int(*)[4]
//對于數組指針解引用,訪問的則是這個數組
printf("%zu\n", sizeof(&a+1));//4/8
//&a是數組的地址,&a+1是跳過數組后的地址
printf("%zu\n", sizeof(&a[0]));//4/8
//第一個元素的地址
printf("%zu\n", sizeof(&a[0]+1));//4/8
//跳過第一個元素的地址,到達第二個元素的地址
return 0;
}

運行結果:
在這里插入圖片描述

(二)字符數組

(1)操作符sizeof

#include<stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f'};printf("%zu\n", sizeof(arr));//6,計算整個數組printf("%zu\n", sizeof(arr + 0));//4/8,首元素的地址printf("%zu\n", sizeof(*arr));//1,*arr就是首元素printf("%zu\n", sizeof(arr[1]));//1,第二個元素printf("%zu\n", sizeof(&arr));//4/8,數組的地址printf("%zu\n", sizeof(&arr + 1));//4/8,依舊是地址printf("%zu\n", sizeof(&arr[0] + 1));//4/8,第二個元素的地址return 0;
}

運行結果:
在這里插入圖片描述

#include<stdio.h>
int main()
{char* p = "abcdef";printf("%zu\n", sizeof(p));//4/8//p是一個指針變量,我們假設地址0x0012ff30printf("%zu\n", sizeof(p + 0));//4/8//p+1就是b的地址printf("%zu\n", sizeof(*p));//1//char*類型指針解引用只能訪問一個字符printf("%zu\n", sizeof(p[0]));//1//p[0]->*(p+0)->*p,就是第一個元素printf("%zu\n", sizeof(&p));//4/8//&p是指針變量p的地址,是二級指針printf("%zu\n", sizeof(&p+ 1));//4/8printf("%zu\n", sizeof(&p[0] + 1));//4/8//&p[0]+1就是b的地址return 0;
}

在這里插入圖片描述
在這里插入圖片描述
(2)庫函數strlen():

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zu\n", strlen(arr));//隨機值//arr是數組首元素地址,strlen算的是整個數組,由于字符串中找不到\0,所以為隨機值printf("%zu\n", strlen(arr + 0));//隨機值//(arr+0)也是首元素地址printf("%zu\n", strlen(*arr));//程序崩潰//arr是首元素地址,*arr就是首元素即‘a’——97//這里就會出現非法訪問內存printf("%zu\n", strlen(arr[1]));//程序崩潰//同上printf("%zu\n", strlen(&arr));//隨機值//整個數組的地址,從數組的起始位置數字符串的長度,但是沒有\0printf("%zu\n", strlen(&arr + 1));//隨機值//跳過這個數組的地址,向后找\0printf("%zu\n", strlen(&arr[0] + 1));//隨機值//從第二個元素的地址,向后找\0return 0;
}
int main()
{char* p = "abcdef";printf("%zu\n", strlen(p));//6//p就是a的地址,直至遇到\0向后數有6個字符printf("%zu\n", strlen(p+1));//5//p+1指向b,向后數直到遇到\0有五個字符printf("%zu\n", strlen(*p));//error//*p就是第一個字符printf("%zu\n", strlen(p[0]));//error//同上printf("%zu\n", strlen(&p));//隨機值//p變量在內存中后續的空間內容不確定printf("%zu\n", strlen(&p+1));//隨機值//同上printf("%zu\n", strlen(&p[0]+1));//5//&p[0]就是a的地址,&p[0]+1就是b的地址,從b的位置向后數return 0;
}

(三)二維數組

  • 這里還是要特別注意:數組名單獨放在sizeof內,表示整個數組
  • 還要注意的一個點:sizeof在計算變量,數組的大小時,是通過類型來推導的,不會真實去訪問內存,舉個栗子:

在下圖中,括號內s=a+2,其中a和2都是int類型,算出來s=12,但sizeof并不會去計算,而是看s本身是什么類型,short類型占兩個字節,所以打印出來的仍是2而不是4;而打印s的值時,也不會因為在sizeof里面的算式而改變。

在這里插入圖片描述

  • 實例
#include<stdio.h>
int main()
{int a[3][4] = { 0 };printf("%zu\n", sizeof(a));//48printf("%zu\n", sizeof(a[0][0]));//4printf("%zu\n", sizeof(a[0]));//16//a[0]是第一行一維數組名,單獨放在sizeof內部// 表示第一行這個數組printf("%zu\n", sizeof(a[0]+1));//4/8//a[0]沒有單獨放在sizeof中// 則a[0]是第一行第一個元素的地址,a[0]+1是第一行第二個元素的地址printf("%zu\n", sizeof(*(a[0] + 1)));//4//*(a[0] + 1)是第一行第二個元素printf("%zu\n", sizeof(a+1));//4/8//a未單獨放在sizeof中,表示數組首元素的地址,就是第一行的地址// a+1就是第二行的地址printf("%zu\n", sizeof(*(a+1)));//16//a+1是第二行的地址,解引用就是a[1]這行數組,計算的是整個數組的大小printf("%zu\n", sizeof(&a[0]+1));//4/8//表示第二行的地址printf("%zu\n", sizeof(*( & a[0] + 1)));//16//第二行的地址解引用就是這一行printf("%zu\n", sizeof(*a));//16//a沒有單獨放在里面,是第一行的地址,解引用就是a[0]printf("%zu\n", sizeof(a[3]));//16//sizeof在計算變量,數組的大小時,是通過類型來推導的,不會真實去訪問內存//所以這里不會有越界訪問return 0;
}

在這里插入圖片描述
我們來測試一下運行結果:
在這里插入圖片描述

本次內容到這里就結束了,謝謝觀看,如有不對歡迎在評論區留言指正。
心向往之行必能至!

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

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

相關文章

LeetCode 刷題【42. 接雨水】

42. 接雨水 自己做 解&#xff1a;雙指針左右分割容器 class Solution { public:int trap(vector<int>& height) {int res 0;int len height.size();if(len < 2) //構不成一個容器了&#xff0c;直接返回return res;int end len - 1; //右邊界int…

網絡的基本概念、通信原理以及網絡安全問題

目錄 1、 什么是網絡&#xff1f; &#xff08;1&#xff09;網絡的概念與本質 &#xff08;2&#xff09;電壓信號的合并與抵消 &#xff08;3&#xff09;電壓的本質 2、中轉設備 &#xff08;1&#xff09;背景 &#xff08;2&#xff09;中轉設備的處理能力與編程能…

Windows下使用WSL2創建Ubuntu子系統(更改安裝位置與啟動圖形桌面)

Windows下使用WSL2創建Ubuntu子系統&#xff08;更改安裝位置與啟動圖形桌面&#xff09; 本文介紹如何使用WSL2創建Ubuntu子系統&#xff0c;并更改安裝位置到其他磁盤&#xff0c;并啟動圖形桌面Xfce4。 WSL 版本: 2.5.7.0 系統版本: Windows11 23H2 相關工具&#xff1a;Mo…

時間泄漏 TemporalLeakage

時間泄漏 TemporalLeakage: 就是后續有事件發生&#xff0c;然后才有了這個結果&#xff0c;但是在該事件發生之前&#xff0c;不應該預測該結果。 Temporal Leakage 問題是往往導致縱向Planning不“果斷”。 解決方案&#xff1a;人工標注出時間發生的時刻 真值只監督時間發生…

獨立書店數字化轉型:絕版書修復檔案系統與讀者閱讀行為分析營銷平臺

在電商沖擊與閱讀習慣變遷的雙重壓力下&#xff0c;獨立書店正遭遇 “舊書修復難、新書賣不動” 的生存困境。傳統模式中&#xff0c;絕版書修復依賴老師傅經驗&#xff0c;單本修復周期長達 2 周&#xff0c;損耗率超 30%&#xff1b;營銷缺乏數據支撐&#xff0c;導致客流年均…

const修飾指針用法詳解

目錄 一、const修飾變量 繞過const限制的問題 二、const修飾指針變量 1、無const修飾的指針 2、const放在*左邊 3、const放在*右邊 4、*兩邊都有const 三、使用建議 四、記憶技巧 一、const修飾變量 在C語言中&#xff0c;變量默認是可修改的。如果我們希望某個變量不能…

pcl法線估計的踩坑

1&#xff0c;normalestimation對點云法線的評估&#xff0c;只輸出法線向量&#xff0c;并不輸出xyz值。如果輸出類型是pointnormal&#xff0c;那么這點云的法向量有值&#xff0c;xyz值都是02&#xff0c;添加點云xyz數據。可以使用 pcl::concatenatefields(*a,*b,*c)函數p…

利用Minicsv庫解析csv文件的c程序及讀入測試

上午的c程序寫入xlsx較快但不正確&#xff0c;python程序雖正確但過慢。所以找了一個全部源程序加起來不到4K字節的C語言csv解析庫Minicsv&#xff0c;來改寫&#xff0c;改寫結果如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h…

企微用戶部門同步HRS系統

企微用戶導入HR系統流程說明 概述 本文檔詳細說明了WechatUserImportServiceImpl.importWechatUsersToHrs()方法的業務流程和實現邏輯。該方法負責將企業微信用戶數據同步導入到HR管理系統中&#xff0c;包括員工信息、工作信息和任職記錄的創建與更新。 主要功能 數據同步…

告別傳統SEO!擁抱下一代流量密碼:生成式引擎優化(GEO)實戰指南

前言&#xff1a;為什么你的“最佳實踐”SEO正在失效&#xff1f;你是否發現&#xff0c;即使嚴格遵循了谷歌自2019年以來的所有“最佳實踐”&#xff0c;你的技術博客或產品文檔的流量依舊增長乏力&#xff0c;甚至不升反降&#xff1f;你不是一個人。問題在于&#xff0c;游戲…

week1-[一維數組]傳送

week1-[一維數組]傳送 題目描述 有 nnn 個傳送門&#xff0c;從第 iii 個傳送門進去后會被傳送到第 aia_iai? 個傳送門&#xff0c;進而被傳送到第 aaia_{a_i}aai?? 個傳送門&#xff0c;如此一直下去……小 A 想知道從第 kkk 個傳送門進去后&#xff0c;能不能回到第 kkk 個…

【18】目心智能——目心智能 嵌入式一面 ,校招,面試問答記錄

目心智能——目心智能 嵌入式一面 &#xff0c;校招&#xff0c;面試問答記錄 1 簡單自我介紹2 你做了這么多算法&#xff0c;為什么不找算法的&#xff1f;3 我們主要還是軟件開發&#xff0c;不做結構設計4 模電知識6 CSDN應該附鏈接在簡歷上&#xff0c;稍后發給我&#xff…

C++第二十課:快遞運費計算器 / 黑白配+石頭剪刀布小游戲

快遞運費計算器幫一家快遞站點開發一個快遞運費計算器&#xff0c;快遞站點人員只需要輸入包裹重量和地點編號即可計算出對應的運費。假設快遞費計算規則如下&#xff1a;首重&#xff1a;3公斤 3公斤以內&#xff1a;1.東三省/寧夏/青海/海南&#xff1a;12元&#xff0c;2.新…

網絡安全藍隊常用工具全景與實戰指南

摘要 在現代信息系統的安全防護中&#xff0c;藍隊承擔著防御、檢測、響應和持續改進的核心職責。要實現高效、可持續的防御能力&#xff0c;藍隊需要一整套成熟、可靠的工具集來進行威脅情報收集、日志分析、入侵檢測、漏洞評估、端點防護、網絡流量監控、事件響應與取證等工作…

基于 Flink 的淘寶實時數據管道設計:商品詳情流式處理與異構存儲

引言在電子商務領域&#xff0c;實時數據處理能力已成為企業核心競爭力的重要組成部分。淘寶作為中國領先的電商平臺&#xff0c;每天產生海量的商品數據&#xff0c;這些數據需要被實時處理、分析并分發到各種存儲系統中&#xff0c;以支持搜索、推薦、庫存管理等關鍵業務。本…

面試題:【多線程問題,三個線程A,B,C;C線程依賴B線程的結果執行,怎么控制】

在 Java 中&#xff0c;若需要控制線程間的依賴關系&#xff08;如 C 線程依賴 B 線程的結果&#xff09;&#xff0c;可以通過以下幾種方式實現&#xff1a; 方案 1&#xff1a;使用 CountDownLatch CountDownLatch 是一個同步工具類&#xff0c;允許一個或多個線程等待其他線…

React useMemo 深度指南:原理、誤區、實戰與 2025 最佳實踐

把“為什么用、怎么用、用錯了怎么辦”一次講透&#xff0c;附 React 19 自動優化前瞻。一、useMemo 是什么&#xff1f; 一句話&#xff1a; useMemo 記住&#xff08;緩存&#xff09;昂貴計算結果&#xff0c;只在依賴變化時重新計算。 const memoValue useMemo(() > {…

[ HTML 前端 ] 語法介紹和HBuilderX安裝

目錄 一. HTML 1.概述 2. 安裝前端開發工具 (1)HBuilderX下載 (2)創建html項目和使用 3. HTML基礎 1.標簽 (1).標簽定義: (2).標簽結構: (3).標簽屬性: 2.常用標簽: 3.特殊符號: 4.表格(table) (1)基本標簽: (2)基本結構: (3)表格屬性: 5.表單(form) (1). 表單概述…

Spring Cloud系列—Alibaba Sentinel熔斷降級

上篇文章&#xff1a; Spring Cloud系列— Alibaba Sentinel限流https://blog.csdn.net/sniper_fandc/article/details/149944260?fromshareblogdetail&sharetypeblogdetail&sharerId149944260&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link…

Spring Boot 使用 @NotBlank + @Validated 優雅校驗參數

在日常開發中&#xff0c;我們常用 if (isBlank(...)) 來判斷參數是否為空&#xff0c;但這種方式不僅繁瑣&#xff0c;而且容易遺漏。 Spring 生態中推薦使用 JSR-303 校驗注解&#xff08;NotBlank、NotNull 等&#xff09;配合 Validated 實現自動校驗&#xff0c;大幅減少手…