乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      數(shù)組和指針并不相同

       黃南山 2018-02-02

      extern int *x;

      extern int  y[];

      x是一個指向int類型的指針,y是一個int型數(shù)組,沒有給出數(shù)組長度,是不完整類型,但是聲明的時候數(shù)組的長度并不是必須,但我還是建議加上數(shù)組的維數(shù),那樣只看聲明就能知道數(shù)組有多大。上面兩個聲明是不同的數(shù)據(jù)類型。

      什么是聲明,什么是定義?

      聲明相當(dāng)于普通的聲明:它所說明的并非自身,而是描述其他地方創(chuàng)建的對象。

      定義相當(dāng)于特殊的聲明:它為對象分配內(nèi)存。

      這就是為什么一個函數(shù)在main函數(shù)之前定義,我們不用再聲明,main也可以調(diào)用這個函數(shù),因?yàn)槎x是特殊的聲明。

       但是C語言,它本身為了和老代碼兼容以及一些歷史遺留問題,讓它變得有些缺陷。比如,都知道定義只能有一次,聲明可以有多次。

      eg:

      復(fù)制代碼
      #include<stdio.h>
      int a;
      int a;
      int main(void)
      {
          int b;
          int b;
          
          return 0;
      }
      復(fù)制代碼

      變量b會報(bào)重復(fù)定義,但是變量a卻不會,奇怪么?局部變量,和上面說的一樣,定義只能一次,聲明可以多次,所以變量b重復(fù)定義,但是為什么變量a編譯器通過了這種寫法呢?這里是定義了兩次還是其他情況?

      我們把上面的變量b去掉,只測試變量a:

      復(fù)制代碼
      #include<stdio.h>
      int a=3;
      int a;
      int main(void)
      {
      
          
          return 0;
      }
      復(fù)制代碼

       

      復(fù)制代碼
      #include<stdio.h>
      int a;
      int a=1;
      int main(void)
      {
      
          
          return 0;
      }
      復(fù)制代碼

       

      這樣三種寫法,編譯都通過,那么我們再測試:

      復(fù)制代碼
      #include<stdio.h>
      int a=3;
      int a=1;
      int main(void)
      {
      
          
          return 0;
      }
      復(fù)制代碼

      終于,報(bào)錯了。從測試過程來看,gcc還是不允許多次定義同一個變量的。那么為什么前面的測試看起來像是重復(fù)定義了呢?這是因?yàn)閏語言的全局變量,默認(rèn)有外部屬性,int a;int a=1;這樣的,第一個是聲明,第二個是定義,只有在全局變量時才是這樣,上面的int a,相當(dāng)于extern int a;所以前面三種測試沒報(bào)錯。這個缺陷,在c++中已經(jīng)修復(fù),c++中絕對不允許這樣的寫法。

      復(fù)制代碼
      #include<iostream>
      
      int a;
      int a=1;
      int main(void)
      {
      
          return 0;
      }
      復(fù)制代碼

      像這樣的C語言灰色地帶還有很多。

       

      所以,使聲明和定義相匹配是很重要的。

      經(jīng)過gcc檢測,形如:

       

      extern char *p;
      char p[10]="abcd";

      這樣的聲明和定義是不能通過編譯器的,或許c專家編程還是有點(diǎn)古老了吧。

       

       

       

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多