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