Chapter 04 陣列和指標並不相同

2022-08-09 00:36:16 字數 2115 閱讀 4821

「陣列和指標是相同的」是一種非常危險、並不完全正確的說法。

ansi標準:

extern

int *x; //

x是個int型的指標

extern

int y; //

y是個int型陣列,長度尚未確定

陣列定義不等同於指標的外部宣告的情況:

檔案1:

//

定義了乙個int陣列

int mango [100];

檔案2:

//

外部宣告的指向int型的指標

extern

int * mango;

上述**的錯誤如下:

c語言中的「物件」(不同於c++或其他物件導向程式設計語言的『物件』,這裡的物件只是跟鏈結器有關的「東西」,如函式和變數)必須有且只有乙個定義,但它可以有多個extern宣告。

定義:建立了乙個物件,確定物件的型別並分配記憶體。只能出現在乙個地方。

宣告:描述了乙個物件,說明了在其他地方建立(定義)的物件的名字,允許在後面的**中使用。可以多次出現。

宣告乃普通的宣告,描述其他地方建立的物件;而定義則相當於特殊的宣告,它為物件分配記憶體。

在賦值語句「x = y;」中:

x是左值,是乙個位址,表示儲存結果的地方,在編譯時可知;

y是右值,含義是y所代表的位址的內容,執行時可知。

標準規定賦值符必須用可修改的左值作為它左邊一側的運算元。

每個符號的位址在編譯時可知。而對於指標,必須首先在執行時取得它的當前值,然後才能進行解除引用操作。

如下**:

//

a是乙個char陣列,也就是乙個記憶體位址,其值(位址)在編譯時可知

//a[0] 即 位於這個記憶體位址處

char a[9] = "

abcdefgh

";

陣列a的位址為0x002afd8c,這個位址也儲存了字元「a」——直接引用

而對於指標來說:

//

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...