C語言指標突破

2021-08-08 22:16:27 字數 3649 閱讀 9004

指標的表示式

指標的遞增與比例因子

指標與陣列

指標與字串

指標陣列

指向函式的指標

指標型別的相容性與型別轉換

指標與結構體

「&」的使用

&只能用於單個變數或乙個陣列元素

「*」的使用

*:稱為反引用運算子

-1

p = &quantity;n = *p;

//上面這句的等價推導

n = *&quantity = quantity;

*ptr=25;該句相當於將25賦值給ptr指向的資料變數

指標變數的申明

data_type *pt_name

1. *號說明pt_name是乙個指標變數

2. pt_name需要乙個記憶體空間

3. pt_name是指向data_type型別的變數的指標

pt_name 分配的記憶體長度與指向的變數型別有關,同是指標,指向不同型別的變數,則比例因子不一樣

指標變數的初始化
-2

int *p

p = &quantity;

或者

int *p = &quantity;
本句中初始化與申明結合到一起,是對p初始化而非*p

同樣,也可以使用該語句同時宣告變數和指標變數

int x,*p = &x;
初始化指標使用的常量只能是null或0

指標鍵指標的指標的宣告

int **p指向整型指標的指標

1. 指標指向的變數參與運算

eg:

-3

y=*p1**p2;

sum += *p;

z = 5*-*p2/*p1;

2. 指標值與整數進行運算
-4

p1+4

p2-2

p1-p2

如果p1,p2指向同一陣列,|p1-p2|給出p1和p2間元素的數量

3. 指標使用快捷運算子
-5

p1++

-p2sum += *p2

4. 指標使用關係運算子
-6

p1>p2

p1 == p2

p1 != p2

指標可以進行p1+1p1+2的運算,但當指標使用p1++時,指標指向相同型別的下乙個值

當指標進行遞增時,所增加的值為該指標所指向的資料型別長度,這個長度成為比例因子

可以用`sizeof(x)運算子得到x變數所需要的位元組數

(1) 當宣告乙個陣列時,編譯器在臨近的記憶體空間分配乙個基本位址和足夠的儲存空間,基本位址就是陣列的第乙個元素的儲存位置。

即,陣列名是乙個指向第乙個元素的常量指標

p = x => p = &x[0] //兩者是等價的,之後可以通過p++訪問每乙個值
和之前有區別的是,這裡p+1 = &x[1]p+2 = &x[2]

這裡的p的增加,也是按照比例因子變化的

當需要遍歷乙個陣列時可以

-7

p=x;

while(p<=&x[4]) //x是含有5個元素的陣列

(2) 用指標操縱二維陣列

對於a[i][j]可以用*(*(a+i)+j)實現

其中a+i指向為第i+1行的第乙個元素

對於乙個靜態的二維陣列a[5][4] 其儲存是在一片連續的記憶體,訪問a[i][j]時,a[i][j] = *(p+4*i+j)

故宣告二維陣列時,需指定每行的大小,編譯器才能確定正確的儲存對映。

建立字串的兩種方法

(1) 字元陣列char str[5]="good";

(2) char型別指標char *str = "good";

指標指向good的第乙個字元

-8 

char *string1;

string1 = "good";

//string1 為指向字串的指標,也是字串的名字

指標用於處理字串表時,可以用指標元素指向字串

-9

char *p[3] = ;

注意*p[3](*p)[3]的區別

前者表示把p宣告為含3個指標變數的陣列,後者表示申明為指向含有3個元素的陣列的指標

(1) 宣告: `type (*fptr)()

(2) 把函式名賦給指標就可以

把函式指標指向某個函式

無括號時type *fptr()為宣告fptr為乙個函式,函式返回指向type型別的指標

-10

double mul(int,int);

double (*p)();

p = mul;

(*p)(int a,int b); //函式呼叫

(1) 宣告為指標的變數不止是乙個指標型別的變數,他也是指向某種基本資料型別的指標。不同型別的指標之間不能相互賦值,這稱為指標的不可相容性。

(2) 不同型別的指標變數儲存的都是記憶體位址,這些記憶體位址是相容的,利用型別轉化運算子就可以在不相容的指標型別之間顯式的進行賦值操作。

\\i.e -11

int x;

char *p;

p = (char*)&x;

(3) 空指標(void *)是通用指標,可以表示任何指標型別。所有指標型別都可以賦值給空指標,空指標無需型別轉換就可以賦給任意指標

當指標指向struct 型別的變數時,可以通過->箭頭運算子訪問其成員,如

ptr->number == (*ptr).number

「.」運算子比」*」運算子的優先順序高

運算子」->」 , 「.」 , 「」 , 「()」的優先順序最高

-12

++ptr->count //表示count遞增

(++ptr)->count //ptr遞增,然後與count連線

*ptr->p //獲取p指標指向的值

(*ptr->p)++ //p指向的內容遞增

*ptr++->p //訪問ptr指向的內容後ptr遞增

以上,最近博主在學資料結構,如果碰到了問題會繼續補充。

C 借助指標突破訪問許可權

c 物件導向中有一大特性就是封裝,使用不同的訪問控制符來控制外界對其的訪問許可權。例如 c 中類的private成員對外是不可見的,可以通過以下方法突破對private成員的訪問許可權 includeusing namespace std class a templatevoid func cons...

C語言指標

指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...

C語言指標

1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...