C語言學習筆記5

2021-07-28 19:11:06 字數 3309 閱讀 7596

int num[5] = ;

int*p = num;

type

列印時的值

第二次列印的值

源位址的值(陣列內的值)

*p++

1020

10*(p++)

*和++

的優先順序相同,根據結合性是從右往左,所以p先和後自增運算子++

相結合,++

操作會在表示式完成後進行自增,也就是先取出p位址裡的值,然後p的下標後移一位

type

列印時的值

第二次列印的值

源位址的值(陣列內的值)

*++p

2030

20*(++p)

*和++

的優先順序相同,根據結合性是從右往左,所以p先和前自增運算子++

相結合,++

操作會在表示式執行時立即完成,也就是先把p的下標後移一位,然後再取出這個下標的值

type

列印時的值

第二次列印的值

源位址的值(陣列內的值)

*(p++)

1011

11

根據優先順序

,小括號優先順序最高,p先和*相結合,立刻取出這個下標的值,然後這個值和後自增運算子++

結合,因為是後自增,++

操作將在表示式完成後進行自增,也就是先列印p下標的值,然後再將這個值自增1

type

列印時的值

第二次列印的值

源位址的值(陣列內的值)

++*p

1112

11++(*p)

*和++

的優先順序相同,根據結合性是從右往左,所以p先和取址運算子*相結合,

然後這個值和前自增運算子++

相結合,也就是因為是前自增,++

操作將在取值完成立即自增,也就是先取出p下標的值,然後再將這個值自增1,同時列印出來

總結

* 如果乙個表示式有多個運算子,那麼悠閒進行優先順序判斷,先執行優先順序高的運算子

* 如果運算子優先順序相同,那麼就看結合性,根據結合方向來做運算

結合性

* 從左往右:簡稱左結合,變數名和表示式在運算子兩側,運算順序是從左向右的(小括號 () 、中括號 、成員選擇 , 、成員選擇 -> 、雙目運算子 、逗號運算子)

* 從右往左:簡稱右結合,變數名和表示式在運算子兩側,運算順序使從右往左的(單目運算子 、三目運算子 、賦值類運算子)

int

*p[n] = ;

根據優先順序,的優先順序高於*,所以 p 先和 [n] 相結合,說明 p 是乙個陣列名,然後再和 int* 結合,說明這個陣列裡每個元素都是乙個 int 型別的指標
示例

* 使用指標陣列接收多個資料的位址

#include 

int main(void)

; int *p[3];

for(int i = 0; i < 3; ++i)

for(int i = 0; i < 3; ++i)

}

#include 

int main(void)

; char *str1 = str[1]; // 定義乙個字元指標,指向指標陣列 str 第二個字串的位址

char *str2 = *(str +3); // 定義乙個字元指標,指向指標陣列 str 第四個字串的位址

char ch1 = *(*(str + 4) + 2); // 定義乙個字元變數,接受了指標陣列第五個字串的第三個字元

char ch2 = (*str + 5)[7]; // 定義乙個字元變數,接收指標陣列第乙個字串的第 5+7 個字元

char ch3 = *str[0] + 6; // 定義乙個字元變數,接收指標陣列第乙個字串的第乙個字元,ascii再加上6

printf("str1 = %s\n", str1);

printf("str2 = %s\n", str2);

printf("ch1 = %c\n", ch1);

printf("ch2 = %c\n", ch2);

printf("ch3 = %c\n", ch3);

return

0;}

輸出結果為

str1 = programming

str2 = c

ch1 = o

ch2 = 2

ch3 = o

int (*p)[n];

int a[3][4] = ;

int (*p)[4] = a;

int a[3][4][5] = ;

int (*p)[4][5] = a;

() 和  優先順序相同,但是結合性是從左往右,所以 p 先和 * 相結合,說明 p 是乙個指標,在和 int 相結合,說明這個是乙個指向 int 型別陣列的指標
示例

void func(int p[2][3], int n);

void func(int p[3], int n);

void func(int (*p)[3], int n);

int main(void)

, };

func(a, sizeof(a) / sizeof(int));

return

0;}

總結

* 指標陣列:看後面兩個字,就是乙個陣列,這個陣列每個元素都是乙個指標,這個陣列在記憶體空間裡佔了 n 個指標大小的儲存空間

* 陣列指標:看後面兩個字,就是乙個指標,這個指標指向了乙個陣列,這個指標在記憶體空間裡佔了 1 個指標大小的儲存空間

* 二級指標p 和 二維陣列p 的區別:

int **p = null; 是乙個整型的二級指標,p 是可變的變數,我們可以讓它指向任何我們想讓它指向的地方這個變數只佔 4或8 個位元組,所以不需要單獨指定大小
int p[n][m] = ; 是乙個整型的二維陣列,p 指向一塊連續的記憶體空間的首位址,我們可以用 p 找到這塊記憶體空間,這塊空間占用了 sizeof(int) * n * m 個位元組大小

p 是乙個不可變的常量,只能永遠的指向這塊記憶體

C語言學習筆記5

持續更新一些 c語言學習 的筆記。上次說到語言程式的編寫和執行,那麼接下來進行一下補充。編寫和執行過程 使用文字編輯工具編寫c 程式,其檔案字尾為.cpp,這種形式的程式稱為原始檔 source code 然後用編譯器將源 轉換成二進位制形式,檔案字尾為.obj,這種形式的程式稱為目標 object...

C語言學習筆記5

回顧 1.負數的二進位制轉換規則 2.操作符 算數操作符,邏輯操作符,位操作符,三目操作符 作業 1.提示奇數或偶數 2.提示正負數 移位操作符 左移 和右移 3 2 0000 1100 左移固定在右邊補0 12 2 0000 0011 有符號數字右移左邊補符號位 無符號數字右移左邊補0 取位址操作...

C語言學習筆記 5

1.陣列作為函式引數 函式是我們學習程式語言最基本的東西了,我在此不再贅述。只討論一種特殊情況,就是陣列作為函式的引數傳遞。我們都知道,其實在傳遞陣列的時候,實際上是傳遞了陣列首元素的指標。明確了這一點之後,我們就可以思考下面的問題。既然他只是傳遞了陣列首元素的指標,那麼他必然無法知道整個陣列的大小...