數組指針 sizeof 實現_C++數組指針!

201dc2131fcafa8796488215f511a2ee.png

學習C++數組的時候,對數組的了解不是很深。也不知道,為什么聲明一個數組,int a[10],為什么a就是數組的地址。

你可以這樣理解,將a理解為指向數組頭的一個指針,這樣就好理解了。理解了之后確實好像豁然開朗的樣子。這樣a[5]就等于*(a+5),也就相當于將數組頭指針向后推5個位置,然后取到該位置的數據了。仿佛一切都很完美。

可是當我對C++使用的越多的時候,就會發現這個理解越來越多紕漏。

我們知道,如果我們有一個int數組a[10],sizeof(a)會求出40。相信不少人都會寫過以下的代碼吧

int arraySize(int a[]) {

return sizeof(a)/sizeof(int);

}

我們想要求一個數組的長度,但是當我們用這個函數來求數組的長度的時候,會發現要么輸出1要么輸出2。為什么會這樣呢?

我們在C++面試的時候會遇到這樣的題目

int a[5] = {1,2,3,4,5};

int* p1 = (int*)(&a+1);

int* p2 = (int*)(a+1);

cout << *(p1-1) << " " << *(p2-1) << endl;

問輸出什么?

大家都知道輸出時5和1,那大家有沒有嘗試去理解一下為什么是這樣呢?

為了解決這個問題,我寫了一段代碼進行測試:

#include<iostream>

#include <typeinfo>

using namespace std;

#define type(a) typeid(a).name()

int main() {

int a[10] = {1,2,3,4,5,6,7,8,9,10};

cout << "a=" << a << " &a=" << &a << endl;

int* p1 = (int*)(&a+1);

int* p2 = (int*)(a+1);

cout << "*(p1-1)=" << *(p1-1) << " *(p2-1)=" << *(p2-1) << endl;

cout << "sizeof(a)=" << sizeof(a) << " sizeof(&a)=" << sizeof(&a) << endl;

cout << "TypeOf(a)=" << type(a) << " TypeOf(&a)=" << type(&a) << endl;

}

運行結果如下:

我們可以看到,一個數組a[10],a的值和&a輸出的值是一樣的。

但是對a+1和對&a+1卻會得到不同的結果。

對他們分別用sizeof函數取大小,發現a占用了40個字節,&a占用了8個字節。

最后我們查看a和&a的類別,發現a是A10_i類型的,而&a是PA10_i類型的。

這說明了什么?

說明了數組名a并不是一個int型的指針,而是一個新的數據類型,是一個A10_i類型,代表大小為10的int型的數組。而A10_i這個數據類型是會在內存中連續占用10個int型的空間,所以sizeof(a)會返回一個10*4的結果。而&a是一個PA10_i類型,就是指向A10_i數據類型的一個指針,一個指針的大小當然為8了。(根據系統的位數不同而不同)。

那為什么a和&a的輸出值相等呢?這是因為a是一個A10_i的數據類型,輸出的時候會把里面的數組的頭地址輸出出來。而&a時指向A10_i的一個指針,A10_i的地址就等同于他里面包含數組的頭地址,所以兩者會相等。

而&a+1與a+1得到的結果不相等,是因為a相當于一個指向int元素的指針,a+1會加上sizeof(int)的大小。而&a是一個指向A10_i的指針,&a+1會加上sizeof(A10_i)的大小,而sizeof(A10_i)=40,所以就可以解釋為什么兩者不同了。

至于為什么我們想寫一個函數來求數組的長度的時候會失敗,原因是我們的函數接收參數是一個真真正正的int型指針,在傳入參數時會進行類型轉換,將PA_i類型轉化為int型指針,對int指針進行sizeof當然求得指針本身的大小。只有對數組名這個數據類型進行sizeof求大小才能夠求得數組本身的大小。

說到底,就是數組名并不等同于一個指針。數組名是一個我們平常不能顯式聲明的數據類型,只不過里面包含了一個指針,指向數組的頭部。

如果你也想成為一名程序員那就關注我與我交流,不管是零基礎還是入門小白學習,要有個相互監督的伙伴!關注小編的專欄,手把手教你如何實現!工作需要、感興趣、為了入行、轉行需要學習C/C++的伙伴可以跟我學習,技術大牛助你早日成為一名優秀的程序員!

程序猿?zhuanlan.zhihu.com
798daa72daa0aaa5ecbc8861cbba5cce.png

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

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

相關文章

利用人工智能提升團隊包容性

在2018年11月舉行的Gartner應用技術與解決方案峰會上&#xff0c;高級主管分析師John Kostoulas認為&#xff0c;積極培養包容性文化的團隊和團隊領導者將超越他們的目標。Kostoulas引用了CEB-Gartner在2016年進行的一項領導力驗證調查&#xff0c;他指出&#xff0c;性別多元化…

表單驗證開發 - 登錄注冊開發(3)

表單驗證開發 - 登錄注冊開發(3) 一、教程目標 學習如何在表單中添加驗證規則。掌握使用 JSON 配置表單驗證規則的方法。實現前端和后端的表單驗證。 二、教程內容 1. 前端表單驗證 步驟 1&#xff1a;找到表單編輯 在頁面上找到需要編輯的表單&#xff0c;如注冊表單或登錄…

count(1),count(*),count(主鍵) 性能對比及辟謠

分享一波:程序員賺外快-必看的巔峰干貨 前言 前段時間關于統計數量的sql問題和朋友進行了討論&#xff0c;網上關于這三種查詢方式說法不一&#xff0c;主要有以下兩種說法。 count(*) count(主鍵) > count(1) count(主鍵) > count(*) > count(1)今天對這三種方式…

python與會計的論文_甭管前浪后浪,寫完論文的先浪!

原標題&#xff1a;甭管前浪后浪&#xff0c;寫完論文的先浪&#xff01;自愿返校已是板上釘釘的事兒了而對于大家的期末考現在也基本上已經通知線上考試如果沒有線上考試的話&#xff0c;那就是交論文可是&#xff0c;論文動不動就2000字10%查重毛概、各種選修課等等每一門都是…

git 命令 clone分支的代碼

一個項目通常含有很多分支&#xff0c; master分支一般是經過測試&#xff0c;驗證沒有問題后&#xff0c;代碼才會提交到master分支 develop分支&#xff0c;是測試經常拉下來進行測試的分支 直接復制develop分支的git 命令如下&#xff1a; git clone -b develop gitxxx 轉載…

String s = new String(123) 究竟創建了幾個對象

分享一波:程序員賺外快-必看的巔峰干貨 前言 今天上班劃水的過程中有人詢問到這個問題&#xff0c;網上對于這個問題也有爭議&#xff0c;有說創建了一個對象&#xff0c;有說兩個&#xff0c;有說三個。 首先說三個的肯定是扯淡了&#xff0c;今天來討論一下這條語句到底創…

jquery級試題_JS-jQuery練習題面試題

ES5中不能實現繼承的關鍵字A prototypeB callC applyD extends正確答案: D extends //屬于ES6不屬于常見23種設計模式A 單例B MVCC 觀察者D 策略正確答案: B創建型模式&#xff0c;共五種&#xff1a;工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。結構型模式&…

Vue 計算屬性與偵聽器

這一節我們一起學習 vue 中的計算屬性(computed properties)和偵聽器(watch)。 在之前&#xff0c;我們學習過 vue 表達式插值&#xff1a; <div id"example">{{ message.split().reverse().join() }} </div> 如果在模板中放入太多的邏輯會讓模板過重且難…

程序員到底要不要重復造輪子?

分享一波:程序員賺外快-必看的巔峰干貨 關于這個話題&#xff0c;現在這里闡述立場&#xff1a;就公司工作而言&#xff0c;不建議重復造輪子。就個人技術而言&#xff0c;強烈建議造輪子&#xff01; 程序員圈子里流行這么一句話&#xff1a;“不要重復造輪子”。它的原文是…

1582年日歷怎么了_【知乎周邊】知乎2020年日歷開箱+測評

感謝 劉看山 劉看山福利社 知一聲 這邊知乎朋友贈送的禮物&#xff0c;這邊拿到了新的一年2020年知乎的日歷。隨日歷還贈送了一年的鹽選會員體驗卡&#xff0c;這個福利很特別哈。打開盒子&#xff0c;里面是厚厚的但是卻不是很大的一個正方體。側面寫有“有問題的日歷”日歷內…

Redis集群一致性Hash效果的代碼演示

在微服務領域&#xff0c;使用Redis做緩存可并不是一件容易的事情。 像新浪、推特這樣的應用&#xff0c;許許多多的熱點數據全都存放在Redis這一層&#xff0c;打到DB層的請求并不多&#xff0c;可以說非常依賴緩存了。如果緩存掛掉&#xff0c;流量全部穿透到DB層&#xff0c…

多線程-題

1、進程和線程之間有什么不同&#xff1f; 一個進程是一個獨立&#xff08;self contained&#xff09;的運行環境&#xff0c;它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進…

JDK8那些驚為天人的新特性

分享一波:程序員賺外快-必看的巔峰干貨 介紹 隨著java的發展&#xff0c;越來越多的企業開始使用 java8 版本。Java8 是自 java5之后最重要的版本&#xff0c;這個版本包含語言、編譯器、庫、工具、JVM等方面的十多個新特性。本次課程將著重學習其中的一些重點特性。 Jdk8新…

mount 安卓system只讀_Android如何讓system分區可讀寫(MTK安卓6.0)-阿里云開發者社區...

Android 系統默認情況下&#xff0c;system 分區是只讀 mount 的&#xff0c;因為無法進行往里寫數據的&#xff0c;可以用 adb 命令 adb remount 重新 mount 一下。也可以通過在板子上&#xff0c;輸入以下命令重新mount一下system分區命令使其可讀可寫。# mount -o remount /…

【數據結構和算法05】 紅-黑樹(轉發)

2019獨角獸企業重金招聘Python工程師標準>>> 【數據結構和算法05】 紅-黑樹&#xff08;看完包懂~&#xff09; 置頂 2016年04月13日 15:50:25 eson_15 閱讀數&#xff1a;52681 標簽&#xff1a; java數據結構算法紅黑樹 更多 個人分類&#xff1a; ● 結構算法---…

數據結構與算法——二叉樹、堆、優先隊列

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 七、樹 7.1 樹 7.1.1 樹的定義 樹是我們計算機中非常重要的一種數據結構&#xff0c;同時使用樹這種數據結構&#xff0c;可以描述現實生活…

android組建之間通信_Android組件化(三)組件之間的通信

介紹在組件化開發的時候&#xff0c;組件之間是相互獨立的沒有依賴關系&#xff0c;我們不能在使用顯示調用來跳轉頁面了&#xff0c;因為我們組件化的目的之一就是解決模塊間的強依賴問題&#xff0c;假如現在要從A業務組件跳轉到業務B組件&#xff0c;并且要攜帶參數跳轉&…

繼牛津大學后,加大伯克利分校等多家美國高校終止與華為合作

文&#xff0f;AI財經社 唐煜編&#xff0f;嵇國華據 Nature News 報道&#xff0c;在美國相關部門的壓力之下&#xff0c;加州大學伯克利分校&#xff08;UC Berkeley&#xff09;近日宣布不再與華為簽署新的研究合作&#xff1b;德州大學奧斯丁分校也正在審查自身與華為的關系…

為什么varchar字段長度最好是2的n次方-1

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 計算機是二進制計算的&#xff0c;1 bytes 8 bit ,一個字節最多可以代表的數據長度是2的8次方 11111111 在計算機中也就是-128到127。 而var…

運籌學狀態轉移方程例子_強化學習第4期:H-J-B方程

在上一篇文章中&#xff0c;我們介紹了一種最簡單的MDP——s與a都是有限的MDP的求解方法。其中&#xff0c;我們用到了動態規劃的思想&#xff0c;并且推出了“策略迭代”、“值迭代”這樣的方法。今天&#xff0c;我們要來講更加一般的最優控制問題——t、a與s都是連續的問題。…