天天看點

指針和引用(1)指針及其應用

注:讀《程式員面試筆記》筆記總結

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函數,這種對句柄的限制主要是出于安全考慮,防止使用者随意修改系統資源,進而導緻一場情況發生。

繼續閱讀