C語言可能不清楚的知識點(2) 指標

2021-10-14 01:41:42 字數 2537 閱讀 8860

指標是一類變數,與其他變數不同的是它存放的值是位址。

int

*a;//表示a是乙個指向int型別資料的指標,在定義時*作為型別說明符說明他是乙個指標型別的變數。

在使用a時要注意a的值是乙個位址,而*a的值是乙個int型別資料位址上的值,此時星號是乙個指標運算子,用來引用乙個int型別資料位址上的值。這時候的&a則代表取存放指標變數a的儲存單元的位址,&為取位址運算子。

·注意定義後的指標變數最好初始化他,因為不初始化時指標指向乙個不確定的儲存單元,該儲存單元可能存放乙個有用的資料。

·當指標作為函式的形式引數時,該形式引數與實際引數都指向同乙個儲存單元。形參通過改變該儲存單元的值時實參的值同樣改變,這是位址傳遞。而普通變數間的值傳遞相當於把實參的值複製給形參使用,不會影響實參的值。

指標加或減乙個整型變數n(抑或是乙個整型的表示式)相當於讓指標前進或後退n個位置。而這個位置長度由指標的基型別決定,基型別有多少個位元組,前進乙個位置便是多少個位元組。

·如果兩個指標相加,這沒有意義。但在乙個陣列中兩個指標相減可得出指標指向的元素之間相差了多少個位置。

·不能把乙個整數賦給乙個指標變數,系統不會把它當成位址。

int a[10]

;int

*p=a;

1.下標法:a[i]形式。

2.指標法:*(p+i)形式。把p改為a同樣可行,因為陣列名是陣列的首位址。

a[i]形式在系統內部同樣需要變為指標形式,而直接使用指標形式可省略該步驟,執行速度更快。但要注意:p++是合法的,但a++不合法,因為a是乙個位址常量不能改變,而p是乙個指標變數可以改變。

·想要把位址引入函式之中,函式形參就需要乙個指標變數接收實參傳來的位址。而以陣列作為形參時,並不會對陣列的長度進行檢查,因為系統也把該形參當作乙個指標處理,所以形參的陣列名等於指標,它的值可以被改變。

定義乙個二維陣列

int a[10]

[10];

此時a為整個二維陣列的首位址。

讓我們回顧一下,若有定義int a[10],a[0]是陣列第乙個元素的值,*a也是陣列第乙個元素的值,這說明a的作用與指標運算子作用高度相似。讓我們再把它擴充套件到二維陣列。二維陣列可以看作是乙個一維陣列裡每個元素也都是乙個陣列,所以我們也容易得出陣列的乙個記憶體擺放的規律==陣列記憶體的排列是橫向把元素依次排列,即二維陣列a[10][10]中首位址後面排列的是a[0]中10個元素的儲存單元。這同樣可以擴充套件到多維陣列。

·二維陣列指標表現形式有多種,指向第一維的一般被稱為行指標,第二維的一般稱為列指標。

1. 行指標:a,a+1,

&a[0],

&*a等

2. 列指標:a[1]

,*a,a[1]

+1,*(a+

1)+2

,&a[1]

[1]等 3. 值:*

*a,*(*

(a+1)+

1),a[1][

1]等

理清這些最重要是看如何理解*,&和。指標運算子和相當於進入乙個維度,&相當於退出乙個維度。行指標通過星號變為列指標,列指標通過&變為行指標。

int

*p[10];

int(

*p)[10]

;

根據優先順序判斷,為第一優先順序,*為第二優先順序,所以p在沒有括號時會先和下標結合形成指標陣列,第二個由於括號的存在p先和星號結合形成了指標再和下標結合形成陣列指標。

char

* p=

"aaa"

;

此時把字串的首字元位址賦予了p。

而如果想實現從鍵盤輸入字串給指標變數,這時無法像上方**一樣系統分配記憶體給字串,所以需要我們自己先開闢乙個記憶體空間把其位址給予指標,我們再輸入字串才不會報錯。

指標變數不管什麼型別所佔的儲存單元是固定的,不會隨基型別改變而改變。

函式名和陣列名一樣也是函式的首位址,也是乙個常量。

int

(*p)

(char

,int

);

上方**定義了乙個函式指標,指標指向的函式需要乙個char型別和乙個int型別的引數,且函式返回乙個整型值。

同樣需要留意優先順序問題,p括號不能缺少,不然會變為乙個返回指標值的函式。

在使用時*(p+1)並不是函式中下一條語句的意思。

在牛客遇到的一道題:

宣告乙個指向含有10個元素的陣列的指標,其中每個元素是乙個函式指標,該函式的返回值是int,引數是int*。

首先先宣告乙個陣列指標:(*a)[10],我們把它看作p,則題目便可以簡化成

p是乙個函式指標,該函式的返回值是int,引數是int*。

我們寫出p:int (*p)(int *)

再把p代換就可以得到

int (*((*a)[10]))(int *)

//有了新的感悟會再來增加。

C語言可能不清楚的知識點(3) 陣列

陣列名不能和變數名相同。下標裡面必須是乙個常量表示式且為整型。陣列a第乙個元素為a 0 不能一次整體呼叫整個陣列全部元素的值。陣列為二維或多維時第一維下標可為空。陣列未初始化時元素的值為隨機值。部分賦值時,未賦值的元素自動賦值為0。int a 合法,只有這時初始化時可以整體賦值 int a 不合法c...

C語言可能不清楚的知識點(1) 常量與變數

1 實型常量 指數形式如何判斷是否正確 e e前e e後必有數,e e後必為整數,而小數形式若小數點前或後為0可以省略不寫如.15表示0.15,1.表示1.0,但是前後都為0時不可以直接用.代表0,會四捨五入。2 字元常量 普通字元 用單撇號括起來的乙個字元。字元常量只能是乙個字元,且儲存在計算機的...

記錄那些我不清楚的知識點(HTML)

div class link a href target iframehtml a div iframe name iframehtml width 80 height 600px iframe 1 通過 iframe 內聯框架 實現點選左側 超級鏈結,將鏈結內容顯示在右側的 iframe 內聯框架...