注:讀《程式員面試筆記》筆記總結
1.知識點
(1)指針是存放記憶體位址的變量。
(2)指針定義的一般形式:
1 int a=100;
2 int *p=&a;//指針變量p的類型是:int *
(3)取位址操作符:&(定義時的&僅表示該變量是引用,而不是取位址);解引用操作符*(定義指針時的*僅6代表該變量是指針,而非解引用);以上二者是相反的過程。
(4)當需要在被調函數中直接修改主調函數中的變量是,可以将主調函數中變量的位址作為參數,并在被調函數中使用解引用直接修改指針指向的變量。
2.面試題
2.1被調函數中修改主調函數的變量
編寫一個sort函數,将主函數中的變量重新指派,指派後a>=b>=c,并在主函數中補充函數調用語句
1 int main(int argc, char *argv[]) {
2 int a = 80, b = 60, c = 90;
3 /* input a line to make a>=b>=c;*/
4 sort(&a, &b, &c);
5 cout << a << " " << b << " " << c << endl;
6 getchar();
7 return 0;
8 }
答案:
1 void my_swap(int *a, int *b) { //指針作為參數,用解引用來表示變量值
2 int tem = *a;
3 *a = *b;
4 *b = tem;
5 }
6
7 void sort(int *pa, int *pb, int *pc) { //指針作為參數,用解引用來表示變量值
8 if (*pa < *pb) my_swap(pa, pb);
9 if (*pa < *pc) my_swap(pa, pc);
10 if (*pb < *pc) my_swap(pb, pc);
11 }
2.2區分指針和數組
知識點:(1)數組名等價于數組首元素的位址(例字元串的首元素);
(2)數組存儲在棧上,不同數組之前無任何關系;
(3)字元串常量存儲在字元串常量區,相同的字元串隻有一份拷貝;
(4)當數組名作為參數時,相當于傳遞了數組的首元素的位址,而且隻要實參是位址,那麼形參一定是指針(見下面第二個代碼段)。
答案解析見代碼
1 void equal(char str7[], char str8[]) {
2 printf("%d\n", str7 == str8);
3 }
4 int main(int argc, char *argv[]) {
5 char str1[15] = "hello,world";
6 char str2[15] = "hello,world";
7 char str3[] = "hello,world";
8 char str4[] = "hello,world";
9
10 char *str5 = "hello,world";
11 char *str6 = "hello,world";
12
13 //數組存儲在棧上,str1和str3屬于不同的數組變量,在記憶體中沒有任何交集,故結果為0;
14 printf("%d\n", str1 == str2);
15 //雖然str3,str4沒有顯式聲明數組的大小,其大小根據初值決定,此外其他分析同上,故其結果為0;
16 printf("%d\n", str3 == str4);
17 //字元串常量存儲在字元串常量去中,内容相同的字元串常量隻有一份拷貝,故str5,str6同時指向字元串常量的首字母,故str5==str6,結果為1;
18 printf("%d\n", str5 == str6);
19 //函數的結果取決于輸入的參數值是否相等,由于str1!=str2,故結果為0,若參數是str5,str6,則其結果為1
20 equal(str1, str2);
21 getchar();
22 return 0;
23 }
以下代碼段說明上面的知識點四
1 //以下四種函數聲明方式等價,都表示形參是指針
2 void equal(char *str7,char *str8);
3 void equal(char str7[1],char str8[1]);
4 void equal(char *str7[15],char *str8[15])
5 void equal(char *str7[100],char *str8[100])
2.3簡述指針和句柄的差別
答案:在概念上,句柄記錄着資源對象清單中某個成員的索引,起作用類似于指向指針的指針,雖然句柄本質上是一個指針,但是指針可以随意指向一個對象,而句柄隻能間接指向資源對象;在使用上,通過指針可以直接修改指針指向的内容,通過句柄隻能調用一些Windows提供的API函數,這種對句柄的限制主要是出于安全考慮,防止使用者随意修改系統資源,進而導緻一場情況發生。