「陣列和指標是相同的」是一種非常危險、並不完全正確的說法。
ansi標準:
extern陣列定義不等同於指標的外部宣告的情況:int *x; //
x是個int型的指標
extern
int y; //
y是個int型陣列,長度尚未確定
檔案1:
//檔案2:定義了乙個int陣列
int mango [100];
//上述**的錯誤如下:外部宣告的指向int型的指標
extern
int * mango;
c語言中的「物件」(不同於c++或其他物件導向程式設計語言的『物件』,這裡的物件只是跟鏈結器有關的「東西」,如函式和變數)必須有且只有乙個定義,但它可以有多個extern宣告。
定義:建立了乙個物件,確定物件的型別並分配記憶體。只能出現在乙個地方。
宣告:描述了乙個物件,說明了在其他地方建立(定義)的物件的名字,允許在後面的**中使用。可以多次出現。
宣告乃普通的宣告,描述其他地方建立的物件;而定義則相當於特殊的宣告,它為物件分配記憶體。
在賦值語句「x = y;」中:
x是左值,是乙個位址,表示儲存結果的地方,在編譯時可知;
y是右值,含義是y所代表的位址的內容,執行時可知。
標準規定賦值符必須用可修改的左值作為它左邊一側的運算元。
每個符號的位址在編譯時可知。而對於指標,必須首先在執行時取得它的當前值,然後才能進行解除引用操作。
如下**:
//陣列a的位址為0x002afd8c,這個位址也儲存了字元「a」——直接引用。a是乙個char陣列,也就是乙個記憶體位址,其值(位址)在編譯時可知
//a[0] 即 位於這個記憶體位址處
char a[9] = "
abcdefgh
";
而對於指標來說:
//p 是乙個 指向字元的指標
指標p的位址為0x003cf808,這個位址裡面「裝」的內容還是乙個四位元組的位址0x012d5858,這個位址裡面才「裝」的是字元a——間接引用。
綜上所述:當把p「定義為指標,但以陣列方式引用時」,p[i]產生的效果是編譯器會直接將p的位址加上偏移量(i * 步長)然後得到儲存在該記憶體位址的內容。但正確的做法應該是取得儲存於p位址處的內容,將其作為基位址(位元組數取決於機器的位數)再與偏移量相加,產生乙個位址,訪問這個位址得到內容。
指標變數本身始終位於同乙個位址(編譯時可知),但其內容在任何時候都可以不相同(可以指向不同的變數,這些變數可以有不同的值)。
相對的,陣列的位址並不能改變,在不同的時候它的內容可以不同。
陣列和指標都可以在它們的定義中用字串常量進行初始化,但其底層的機制卻不相同。
定義指標時,編譯器只是分配指標本身的空間,除非在定義時用字串常量進行初始化。在ansi c中,初始化指標所建立的字串常量被定義為唯讀。試圖通過指標修改這個字串的值會出現未定義的行為。
而由字串初始化的陣列是可以修改的。
Chapter04 開放 封閉原則
開放 封閉原則,是說軟體實體 類 模組 函式等等 應該可以擴充套件,但是不可修改。這個原則其實是有兩個特徵,乙個是說,對於擴充套件是開放的 open for extension 另乙個是說 對於更改是封閉的 closed for modification 開放封閉原則可以使當需求改變時,可以保持程式...
chapter04 基本TCP套接字程式設計
chapter 04 傳輸層 基本tcp套接字程式設計 相對於書而言,內容沒有什麼價值。書上的內容全面可靠。必要的內容放在正文中。相對而言非主線的內容放在附錄中。這兩個集合之外的內容,可能沒有寫出,或者隨它而去。為了好看增加顏色標識。提問內容顏色標識 綠色 重點程度顏色標識 紅色 藍色 黑體。csd...
人工智慧 chapter04 決策樹
也可用於分類 二 原理 找到符合某個條件來進行分類 就是乙個x furuter 鳶尾花中petal length和petal width兩個x,可以橫著一次 豎著一次 防止過擬合 優缺點 實現功能 1.訓練模型 2.param train sample 包含多條訓練樣本的樣本集,型別為ndarray...