久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語(yǔ)言中數(shù)組名和指針的區(qū)別 及 sizeof用法

 鍵盤(pán)農(nóng)夫 2015-12-22
  1. #i nclude <iostream.h>   
  2. int  main( int  argc,  char * argv[])   
  3. {   
  4. char  str[10];   
  5.   char  *pStr = str;   
  6.  cout <<  sizeof (str) << endl;   
  7.  cout <<  sizeof (pStr) << endl;   
  8.   return  0;   

 實(shí)際情況是:第6行輸出10,,第7行輸出4;

 

先給出三個(gè)結(jié)論:

  (1)數(shù)組名的內(nèi)涵在于其指代實(shí)體是一種數(shù)據(jù)結(jié)構(gòu),,這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,;

  (2)數(shù)組名的外延在于其可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個(gè)指針常量,;

  (3)指向數(shù)組的指針則是另外一種變量類(lèi)型(在WIN32平臺(tái)下,,長(zhǎng)度為4),僅僅意味著數(shù)組的存放地址,!

 

1,、數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu):數(shù)組

  現(xiàn)在可以解釋為什么第1個(gè)程序第6行的輸出為10的問(wèn)題,根據(jù)結(jié)論1,,數(shù)組名str的內(nèi)涵為一種數(shù)據(jù)結(jié)構(gòu),,即一個(gè)長(zhǎng)度為10的char型數(shù)組,所以sizeof(str)的結(jié)果為這個(gè)數(shù)據(jù)結(jié)構(gòu)占據(jù)的內(nèi)存大?。?0字節(jié),。

  1. int  intArray[10];   
  2. cout <<  sizeof (intArray) ;

第2行的輸出結(jié)果為40(整型數(shù)組占據(jù)的內(nèi)存空間大小),。

 

2,、數(shù)組名可作為指針常量

  根據(jù)結(jié)論2,數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,,所以程序1中的第5行數(shù)組名直接賦值給指針,,程序2第7行直接將數(shù)組名作為指針形參都可成立。

 

下面的程序成立嗎,?

C++代碼
  1. int  intArray[10];   
  2. intArray++;

讀者可以編譯之,,發(fā)現(xiàn)編譯出錯(cuò)。原因在于,,雖然數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,,但是它只能被看作一個(gè)指針常量,,不能被修改。

 

而指針,,不管是指向結(jié)構(gòu)體、數(shù)組還是基本數(shù)據(jù)類(lèi)型的指針,,都不包含原始數(shù)據(jù)結(jié)構(gòu)的內(nèi)涵,,在WIN32平臺(tái)下,sizeof操作的結(jié)果都是4,。
順 便糾正一下許多程序員的另一個(gè)誤解,。許多程序員以為sizeof是一個(gè)函數(shù),而實(shí)際上,,它是一個(gè)操作符,,不過(guò)其使用方式看起來(lái)的確太像一個(gè)函數(shù)了。語(yǔ)句 sizeof(int)就可以說(shuō)明sizeof的確不是一個(gè)函數(shù),,因?yàn)楹瘮?shù)接納形參(一個(gè)變量),,世界上沒(méi)有一個(gè)C/C++函數(shù)接納一個(gè)數(shù)據(jù)類(lèi)型(如 int)為"形參"。

 

3,、數(shù)據(jù)名可能失去其數(shù)據(jù)結(jié)構(gòu)內(nèi)涵

到這里似乎數(shù)組名魔幻問(wèn)題已經(jīng)宣告圓滿解決,,但是平靜的湖面上卻再次掀起波浪。請(qǐng)看下面一段程序:

C++代碼
  1. #i nclude <iostream.h>   
  2. void  arrayTest( char  str[])   
  3. {   
  4.  cout <<  sizeof (str) << endl;   
  5. }   
  6. int  main( int  argc,  char * argv[])   
  7. {   
  8.   char  str1[10] =  "I Love U" ;   
  9.  arrayTest(str1);   
  10.   return  0;   
  11. }  
  1. #i nclude <iostream.h>  
  2. void arrayTest(char str[])  
  3. {  
  4.  cout << sizeof(str) << endl;  
  5. }  
  6. int main(int argc, char* argv[])  
  7. {  
  8.  char str1[10] = "I Love U";  
  9.  arrayTest(str1);  
  10.  return 0;  
  11. }  


  程序的輸出結(jié)果為4,。不可能吧,?

  一個(gè)可怕的數(shù)字,前面已經(jīng)提到其為指針的長(zhǎng)度!

  結(jié)論1指出,,數(shù)據(jù)名內(nèi)涵為數(shù)組這種數(shù)據(jù)結(jié)構(gòu),,在arrayTest函數(shù)體內(nèi),str是數(shù)組名,,那為什么sizeof的結(jié)果卻是指針的長(zhǎng)度,?這是因?yàn)椋?

  (1)數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),,其失去了本身的內(nèi)涵,,僅僅只是一個(gè)指針;

  (2)很遺憾,,在失去其內(nèi)涵的同時(shí),,它還失去了其常量特性,可以作自增,、自減等操作,,可以被修改。

  所以,,數(shù)據(jù)名作為函數(shù)形參時(shí),,其全面淪落為一個(gè)普通指針,!它的貴族身份被剝奪,成了一個(gè)地地道道的只擁有4個(gè)字節(jié)的平民,。

 

 

一,、sizeof的概念 

  sizeof是C語(yǔ)言的一種單目操作符,如C語(yǔ)言的其他操作符++,、--等,。它并不是函數(shù)。sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小,。操作數(shù)可以是一個(gè)表達(dá)式或括在括號(hào)內(nèi)的類(lèi)型名,。操作數(shù)的存儲(chǔ)大小由操作數(shù)的類(lèi)型決定。

 

二,、sizeof的使用方法 
  1,、用于數(shù)據(jù)類(lèi)型 
sizeof使用形式:sizeof(type) 
數(shù)據(jù)類(lèi)型必須用括號(hào)括住 。如sizeof(int),?!?
2、用于變量 
sizeof使用形式:sizeof(var_name)或sizeof var_name  
變量名可以不用括號(hào)括住,。如sizeof (var_name),,sizeof var_name等都是正確形式。帶括號(hào)的用法更普遍,,大多數(shù)程序員采用這種形式,。 

三,。sizeof用法總結(jié)
在VC中,,sizeof有著許多的用法,而且很容易引起一些錯(cuò)誤,。下面根據(jù)sizeof后面的參數(shù)對(duì)sizeof的用法做個(gè)總結(jié),。
A. 參數(shù)為數(shù)據(jù)類(lèi)型或者為一般變量。例如sizeof(int),sizeof(long)等等,。這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的 ,。例如int類(lèi)型在16位系統(tǒng)中占2個(gè)字節(jié),在32位系統(tǒng)中占4個(gè)字節(jié),。
B. 參數(shù)為數(shù)組或指針,。下面舉例說(shuō)明.
int a[50]; //sizeof(a)=4*50=200; 求數(shù)組所占的空間大小
#int* a= “hello world”,應(yīng)該是12(要注意)
int *a=new int[50];// sizeof(a)=4; a為一個(gè)指針,,sizeof(a)是求指針
//的大小,在32位系統(tǒng)中,,當(dāng)然是占4個(gè)字節(jié)。
C. 參數(shù)為結(jié)構(gòu)或類(lèi),。Sizeof應(yīng)用在類(lèi)和結(jié)構(gòu)的處理情況是相同的,。但有兩點(diǎn)需要注意,,第一、結(jié)構(gòu)或者類(lèi)中的靜態(tài)成員不對(duì)結(jié)構(gòu)或者類(lèi)的大小產(chǎn)生影響,,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)構(gòu)或者類(lèi)的實(shí)例地址無(wú)關(guān) ,。
第二、沒(méi)有成員變量的結(jié)構(gòu)或類(lèi)的大小為1,,因?yàn)楸仨毐WC結(jié)構(gòu)或類(lèi)的每一 個(gè)實(shí)例在內(nèi)存中都有唯一的地址,。
下面舉例說(shuō)明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個(gè)指針,。
Class test1{ };//sizeof(test1)=1;
D. 參數(shù)為其他。下面舉例說(shuō)明,。
int func(char s[5]);
{
cout<<sizeof(s)<<endl;
//數(shù)的參數(shù)在傳遞的時(shí)候系統(tǒng)處理為一個(gè)指針,,所
//以sizeof(s)實(shí)際上為求指針的大小。
return 1;
}
sizeof(func(“1234”))=4//因?yàn)閒unc的返回類(lèi)型為int,,所以相當(dāng)于
//求sizeof(int). 還要注意的是“1234”而不是“12345”)
以上為sizeof的基本用法,,在實(shí)際的使用中要注意分析VC的分配變量的分配策略,這樣的話可以避免一些錯(cuò)誤,。


示例
char str[20]="0123456789"; int a=strlen(str); //a=10; >>>> strlen 計(jì)算字符串的長(zhǎng)度,,以結(jié)束符 0x00 為字符串結(jié)束。
int b=sizeof(str); //而b=20; >>>> sizeof 計(jì)算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,,不受里面存儲(chǔ)的內(nèi)容改變,。

上面是對(duì)靜態(tài)數(shù)組處理的結(jié)果,如果是對(duì)指針,,結(jié)果就不一樣了
char* ss = "0123456789";
sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,,sizeof 獲得的是一個(gè)指針的之所占的空間,
應(yīng)該是長(zhǎng)整型的 ,所以是4

sizeof(*ss) 結(jié)果 1 ===》*ss是第一個(gè)字符 其實(shí)就是獲得了字符串的第一位'0' 所占的內(nèi)存空間,,
是char類(lèi)型的,, 占了 1 位

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多