关于sizeof表达式作为数组元素个数的编译
想總結這方面的內容,是出于周一參加某公司的筆試題,有一道題是說定義一個整型數組,里面數組元素的個數是用sizeof(unsigned long)表示,這樣是否合法?當時寫的答案是不合法,因為平時寫涉及到申請、定義數組的時候,如果數組大小是一個變量,C++會給報錯。而在幾天之后我在CB上運行之后,發現并沒有錯。就查了一下sizeof的用法,看到MSDN上的關于sizeof和常量的解釋,說的是sizeof之后得出來的是常量,這應該就是解釋了為什么可以用sizeof()來定義一個數組的大小了吧。(后面接著有更合理的解釋)
接著看《C陷阱與缺陷》第三章中的指針與數組,之前也有看到別人總結的“指針數組與數組指針”,便試著自己來把所看到的知識總結下。
1.C語言中只有一維數組,且數組大小必須在編譯期作為一個常數確定下來。
關于這一點,查了“sizeof 編譯期”,出來結果中找到了需要的內容,是一本名叫《Let's C!!!》的書,“sizeof不是函數,默認是一個編譯期的運算符,表達式在編譯期就能得出”(后面還說明了為什么sizeof(指針)在32位系統上得出的結果都是4字節,因為指針的值是可變的,在運行期可以修改,因此在編譯期不能確定指針指向空間的大小)。
還有一個很棒的結果,《C++元編程》 第二節編譯期判斷繼承關系?第3點,C++編譯期三大神器(模板偏特化、函數重載、sizeof)著重看了sizeof的用法,在編譯期直接對它求長的表達式做類型推導,即只是計算類型的字節把它寫入編譯出來的代碼中,而不管里面的內容是什么。博主舉了個例子如下:
#include <iostream>using namespace std;int main(){int i = 0;cout << sizeof(++i) << endl;cout << i << endl;return 0; }輸出結果是4 0,sizeof確實只是對里面的表達式做類型字節的計算,而并不會運行表達式。
?
2.對于一個數組,能做的兩件事:確定數組大小,獲得數組下標為0的元素的指針。
對于數組名傳遞的形參,實質都是數組首元素指針的傳遞。
當把數組名用于sizeof的操作數時(此時數組名代表數組,而不是指針),得到的是整個數組所有元素所占的字節總數,即元素個數×類型字節數。
如果數組名用于其它場合,都是將其視為指針。
?
3.數組指針
寫全該名稱,就是“指向數組的指針”
int a[12][31]; a是一個有著12個數組類型元素的數組
int (*p)[31]; (*p)是一個擁有31個整型元素的數組,p是指向這個數組的指針。
p = a; p指向數組a的第一個元素,即有著31個元素的數組類型元素的一個。
int a[12][31]; int (*P)[31]; //p數組指針,指向a for (p = a; p < &a[12]; p++){int *q;for (q = *p; q < &(*p)[31]; q++){*q = 0;} }4.指針數組
數組指針和指針數組很容易混淆,關鍵是語句的讀取順序,從數組名字開始由內向外閱讀就比較好區分。
int *p[31]; //p和[31]結合,是一個數組,數組元素的類型是(int *)。也就是說p是一個數組,里面元素是指向整型的指針。
int (*p)[31]; //p和*結合,是一個指針,該指針指向一個有31個整型元素的數組。
?
轉載于:https://www.cnblogs.com/cnblogsnearby/p/4930819.html
總結
以上是生活随笔為你收集整理的关于sizeof表达式作为数组元素个数的编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原创)c#学习笔记08--面向对象编程
- 下一篇: 如何美白牙齿