日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

數組和指針并不相同

 黃南山 2018-02-02

extern int *x;

extern int  y[];

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

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

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

定義相當于特殊的聲明:它為對象分配內存。

這就是為什么一個函數在main函數之前定義,我們不用再聲明,main也可以調用這個函數,因為定義是特殊的聲明。

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

eg:

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

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

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

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

    
    return 0;
}
復制代碼

 

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

    
    return 0;
}
復制代碼

 

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

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

    
    return 0;
}
復制代碼

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

復制代碼
#include<iostream>

int a;
int a=1;
int main(void)
{

    return 0;
}
復制代碼

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

 

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

經過gcc檢測,形如:

 

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

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

 

 

 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多