三 學習筆記 c語言基礎 指標

2021-09-26 09:43:45 字數 3165 閱讀 2439

1.定義指標變數

資料在記憶體中的位址也稱為指標,如果乙個變數儲存了乙份資料的指標,我們就稱它為指標變數。

int a = 1;

int *p = &a;

通過指標變數p獲取資料:

printf("%d", *p);
星號*主要有三種用途:
1)表示乘法,例如int a = 1, b = 2, c;  c = a * b;,這是最容易理解的

2)表示定義乙個指標變數,以和普通變數區分開,例如int a = 100; int *p = &a;

3)表示獲取指標指向的資料,是一種間接操作,例如*p = 100; b = *p;

2.指向陣列的指標

array是一系列具有相同型別的資料的集合,每乙份資料叫element(陣列元素)。陣列中的所有元素在記憶體中是連續排列的。

如:

int arr = ;
定義陣列時,要給出陣列名和陣列長度,陣列名可以認為時乙個指標,它指向陣列的第0個元素。

*(arr + 1) 獲取的資料和arr[1]等價
arr本身是乙個指標,可以直接賦值給指標變數p:

int *p = arr;
指標疑惑
*p++ 等價於*(p++),表示先取得第n個元素的值,再將p指向下乙個元素

*++p 等價於*(++p),會先進行++p運算,使得p的值增加,指向下乙個元素,整體上相當於*(p+1)

(*p)++ 等價於對指標變數p獲取的數值做加1操作。

3.字串指標(指向字串的指標)

c語言沒有特定的字串型別,我們通常時將字串放在乙個字元陣列中。

int main()

}

指標和陣列的規則同樣也適用於字元陣列:

int main()

}

c語言有兩種表示字串的方法,

1)是字元陣列:字元陣列儲存在全域性資料區或棧區,使得字元陣列可以讀取和修改

char str = "say hello!";

str = "you you!"; //正確

str[1] = 'a' //正確

2)是字串常量:字串儲存在常量區,只能讀取不能修改

char *str = "say hello!";

str = "you you!"; //正確,可以更改指標變數本身的指向。

str[1] = 'a'; //錯誤,不能對常量進行寫入。

*(str + 1) = 'a'; //錯誤,不能對常量進行寫入。

4.指標變數作為函式引數
#include void swap(int *p1, int *p2)

int main()

5.指標作為函式返回值

c語言允許函式的返回值是乙個指標(位址),我們將這樣的函式稱為指標函式。

int *max(int *a, int *b)

else

}int main()

6.二級指標(指向指標的指標)

指標變數也是一種變數,也會占用儲存空間,也可以使用&獲取它的位址。c語言不限制指標的級數,每增加一級指標,在定義指標變數時就得增加乙個星號*。p1 是一級指標,指向普通型別的資料,定義時有乙個*;p2 是二級指標,指向一級指標 p1,定義時有兩個*。

int main()

解析:*p2指向的是指標變數p1的值,**p2是指標變數p1的獲取資料的值(*p1)

7.指標陣列

如果乙個陣列中的所有元素儲存的都是指標,那麼我們就稱它為指標陣列。

int main()

; //可以不指定長度

//定義乙個指向指標陣列的指標

int **parr = arr;

printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);

printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));

//字串陣列和指標陣列

char *str[3] =

printf("%s\n%s\n%s\n", str[0], str[1], str[2]);

//字串指標陣列

char *str0 = "hello one!";

char *str1 = "hello two!";

char *str2 = "hello three!";

char *str[3] = ;

printf("%s\n%s\n%s\n", str[0], str[1], str[2]);

return 0;

}

8.二維陣列指標
int main()

, };

//定義乙個指向a的指標變數p;

int (*p)[2] = a; //括號中*表明p是乙個指標,它指向乙個陣列。的優先順序高於*,所以()是必須要加的。如果寫成*p[2]就成指標陣列了。

printf("%zu\n", sizeof(*(p+1)));

int i,j;

for(i=0; i<2; i++)

return 0;

}

9.函式指標

乙個函式總是占用一段連續的記憶體區域,函式名在表示式中有時也會被轉換為該函式所在記憶體區域的首位址,這和陣列名非常類似。我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。

#include //返回兩個數中較大的乙個

int max(int a, int b)

int main()

pmax 是乙個函式指標,在前面加 * 就表示對它指向的函式進行呼叫

注意:使用指標變數之前一定要初始化,否則就不能確定指標指向**(野指標),如果它指向的記憶體沒有使用許可權,程式就崩潰了。對於暫時沒有指向的指標,建議賦值null。

Linux基礎入門(三) 學習筆記

備份日誌 小明是乙個伺服器管理員,他需要每天備份論壇資料 這裡我們用日誌替代 備份當天的日誌並刪除之前的日誌。而且備份之後檔名是年 月 日的格式。alternatives.log在 var log 下面。目標為shiyanlou使用者新增計畫任務 每天凌晨3點的時候定時備份alternatives....

C語言基礎學習筆記 指標

1.指標的概念 指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 位址就是記憶體的實體地址 使用指標的目的 要通過指標能夠找到被指的...

Linux命令(三)學習筆記

1 命令格式 more 選項 檔案 2 常用引數引數 描述 n 從笫 n 行開始顯示 n定義螢幕大小為 n 行 pattern 在每個檔案顯示前搜尋該字串 pattern 然後從該字串前兩行之後開始顯示 c從頂部清屏,然後顯示 d提示 press space to continue,q to qui...