数组指针 sizeof 实现_C++数组指针!
學(xué)習(xí)C++數(shù)組的時(shí)候,對(duì)數(shù)組的了解不是很深。也不知道,為什么聲明一個(gè)數(shù)組,int a[10],為什么a就是數(shù)組的地址。
你可以這樣理解,將a理解為指向數(shù)組頭的一個(gè)指針,這樣就好理解了。理解了之后確實(shí)好像豁然開朗的樣子。這樣a[5]就等于*(a+5),也就相當(dāng)于將數(shù)組頭指針向后推5個(gè)位置,然后取到該位置的數(shù)據(jù)了。仿佛一切都很完美。
可是當(dāng)我對(duì)C++使用的越多的時(shí)候,就會(huì)發(fā)現(xiàn)這個(gè)理解越來越多紕漏。
我們知道,如果我們有一個(gè)int數(shù)組a[10],sizeof(a)會(huì)求出40。相信不少人都會(huì)寫過以下的代碼吧
int arraySize(int a[]) {
return sizeof(a)/sizeof(int);
}
我們想要求一個(gè)數(shù)組的長(zhǎng)度,但是當(dāng)我們用這個(gè)函數(shù)來求數(shù)組的長(zhǎng)度的時(shí)候,會(huì)發(fā)現(xiàn)要么輸出1要么輸出2。為什么會(huì)這樣呢?
我們?cè)贑++面試的時(shí)候會(huì)遇到這樣的題目
int a[5] = {1,2,3,4,5};
int* p1 = (int*)(&a+1);
int* p2 = (int*)(a+1);
cout << *(p1-1) << " " << *(p2-1) << endl;
問輸出什么?
大家都知道輸出時(shí)5和1,那大家有沒有嘗試去理解一下為什么是這樣呢?
為了解決這個(gè)問題,我寫了一段代碼進(jìn)行測(cè)試:
#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;
}
運(yùn)行結(jié)果如下:
我們可以看到,一個(gè)數(shù)組a[10],a的值和&a輸出的值是一樣的。
但是對(duì)a+1和對(duì)&a+1卻會(huì)得到不同的結(jié)果。
對(duì)他們分別用sizeof函數(shù)取大小,發(fā)現(xiàn)a占用了40個(gè)字節(jié),&a占用了8個(gè)字節(jié)。
最后我們查看a和&a的類別,發(fā)現(xiàn)a是A10_i類型的,而&a是PA10_i類型的。
這說明了什么?
說明了數(shù)組名a并不是一個(gè)int型的指針,而是一個(gè)新的數(shù)據(jù)類型,是一個(gè)A10_i類型,代表大小為10的int型的數(shù)組。而A10_i這個(gè)數(shù)據(jù)類型是會(huì)在內(nèi)存中連續(xù)占用10個(gè)int型的空間,所以sizeof(a)會(huì)返回一個(gè)10*4的結(jié)果。而&a是一個(gè)PA10_i類型,就是指向A10_i數(shù)據(jù)類型的一個(gè)指針,一個(gè)指針的大小當(dāng)然為8了。(根據(jù)系統(tǒng)的位數(shù)不同而不同)。
那為什么a和&a的輸出值相等呢?這是因?yàn)閍是一個(gè)A10_i的數(shù)據(jù)類型,輸出的時(shí)候會(huì)把里面的數(shù)組的頭地址輸出出來。而&a時(shí)指向A10_i的一個(gè)指針,A10_i的地址就等同于他里面包含數(shù)組的頭地址,所以兩者會(huì)相等。
而&a+1與a+1得到的結(jié)果不相等,是因?yàn)閍相當(dāng)于一個(gè)指向int元素的指針,a+1會(huì)加上sizeof(int)的大小。而&a是一個(gè)指向A10_i的指針,&a+1會(huì)加上sizeof(A10_i)的大小,而sizeof(A10_i)=40,所以就可以解釋為什么兩者不同了。
至于為什么我們想寫一個(gè)函數(shù)來求數(shù)組的長(zhǎng)度的時(shí)候會(huì)失敗,原因是我們的函數(shù)接收參數(shù)是一個(gè)真真正正的int型指針,在傳入?yún)?shù)時(shí)會(huì)進(jìn)行類型轉(zhuǎn)換,將PA_i類型轉(zhuǎn)化為int型指針,對(duì)int指針進(jìn)行sizeof當(dāng)然求得指針本身的大小。只有對(duì)數(shù)組名這個(gè)數(shù)據(jù)類型進(jìn)行sizeof求大小才能夠求得數(shù)組本身的大小。
說到底,就是數(shù)組名并不等同于一個(gè)指針。數(shù)組名是一個(gè)我們平常不能顯式聲明的數(shù)據(jù)類型,只不過里面包含了一個(gè)指針,指向數(shù)組的頭部。
如果你也想成為一名程序員那就關(guān)注我與我交流,不管是零基礎(chǔ)還是入門小白學(xué)習(xí),要有個(gè)相互監(jiān)督的伙伴!關(guān)注小編的專欄,手把手教你如何實(shí)現(xiàn)!工作需要、感興趣、為了入行、轉(zhuǎn)行需要學(xué)習(xí)C/C++的伙伴可以跟我學(xué)習(xí),技術(shù)大牛助你早日成為一名優(yōu)秀的程序員!
程序猿?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的数组指针 sizeof 实现_C++数组指针!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓平板微信和手机微信同时登陆_Mac电
- 下一篇: 利用类定义一个指针会调用默认构造函数吗_