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

分享

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

 黃南山 2018-02-02

extern int *x;

extern int  y[],;

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

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

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

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

這就是為什么一個(gè)函數(shù)在main函數(shù)之前定義,,我們不用再聲明,main也可以調(diào)用這個(gè)函數(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)錯(cuò)了,。從測試過程來看,,gcc還是不允許多次定義同一個(gè)變量的,。那么為什么前面的測試看起來像是重復(fù)定義了呢?這是因?yàn)閏語言的全局變量,,默認(rèn)有外部屬性,,int a;int a=1,;這樣的,,第一個(gè)是聲明,第二個(gè)是定義,,只有在全局變量時(shí)才是這樣,,上面的int a,相當(dāng)于extern int a,;所以前面三種測試沒報(bào)錯(cuò),。這個(gè)缺陷,在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)古老了吧,。

 

 

 

    本站是提供個(gè)人知識管理的網(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ā)表

    請遵守用戶 評論公約

    類似文章 更多