主要是指標陣列、陣列指標、函式指標的學習,以及二重指標、二維陣列的學習。
(1)一般規律:int *p;(p是乙個指標); int p[5];(p是乙個陣列);
(2)定義符號時,首先要搞清楚定義的符號是誰(第一步:找核心),接著看誰跟核心結合(第二步:找結合),然後繼續向外擴充套件。
(3)分析
(1)程式為什麼要分層?
(2)總結
typedef struct teacher
teacher, *pteacher;
(1)typedef int *pint;const pint p2; 相當於是int *const p2;
(2)typedef int *pint;pint const p2; 相當於是int *const p2;
(3)如果確實想得到const int *p;這種效果,只能typedef const int *cpint; cpint p1;
(1)簡化型別的描述
(2)創造與平台無關的型別。
(1)二重指標本質上也是指標變數,和普通指標的差別就是它指向的變數型別必須是個一重指標。
(2)為什麼c語言需要發明二重指標?
(1)二重指標指向一重指標的位址;
(2)二重指標指向指標陣列;
(3)實踐程式設計中二重指標用的比較少,大部分時候就是和指標陣列糾結起來用的。
(4)實踐程式設計中有時在函式傳參時,為了通過函式內部改變外部的乙個指標變數,會傳這個指標變數的位址(也就是二重指標)進去
(1)二維陣列的陣列名表示二維陣列的第一維陣列中首元素(也就是第二維的陣列)的首位址;
(2)二維陣列的陣列名a等同於&a[0],這個和一維陣列的符號含義是相符的。
(3)用陣列指標來指向二維陣列的陣列名是型別匹配的。
(1)用int *p來指向二維陣列的第一維a[i]
(1)二維陣列的第二維元素其實就是普通變數了(a[1][1]其實就是int型別的7),已經不能用指標型別和它相互賦值了。
(2)除非int *p = &a[i][j];,類似於指標指向二維陣列的第一維。
#include int main(void)
, };
//int a[2][5] = ;
printf("a[1][3] = %d.\n", a[1][3]);
printf("a[1][3] = %d.\n", *(*(a+1)+3));
//int *p1 = a; // 型別不匹配
//int **p2 = a; // 型別不匹配
// 指標指向二維陣列的陣列名
int (*p3)[5]; // 陣列指標,指標指向乙個陣列,陣列有5個int型別元素
p3 = a; // a是二維陣列的陣列名,作為右值表示二維陣列第一維的陣列
// 的首元素首位址,等同於&a[0]
p3 = &a[0];
printf("a[0][3] = %d.\n", *(*(p3+0)+3));
printf("a[1][4] = %d.\n", *(*(p3+1)+4));
// 指標指向二維陣列的第一維
//int *p4 = &a[0]; // 不可以
int *p4 = a[0]; // a[0]表示二維陣列的第一維的第乙個元素,相當於是
// 第二維的整體陣列的陣列名。陣列名又表示陣列首元素
// 首位址,因此a[0]等同於&a[0][0];
int *p5 = &a[0][0];
printf("a[0][4] = %d.\n", *(p4+4));
int *p6 = a[1];
printf("a[1][1] = %d.\n", *(p6+1));
// 指向二維陣列的第二維
return 0;
}
指標學習2
1 指向指標的指標 二級指標 指向一級指標 值一定是一級指標的位址 例 int num 10 int p 一級指標 值是變數的位址 int pf p 二級指標 值是一級指標的位址 int q pf 指標 值是二級指標的位址 printf p d,pf d,q d p,pf,q 解幾級指標,就咬用到幾...
C 學習筆記 指標2
關於指標形參的注意事項 不要企圖通過改變指標形參的值而使指標實參的值改變,看下面的 include void swap int p1,int p2 int main int a 5,b 9 int pa,pb pa a pb b if a b swap pa,pb std cout a b 要想輸入...
《C和指標》學習筆記2
在c中,在幾乎所有使用陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列裡第乙個元素的位址。它的型別取決於陣列元素的型別。只有在兩種情況下,陣列名並不用指標常量來表示,就是當陣列名作為sizeof操作符或者單目操作符 的操作時。sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。取乙個陣...