上周末,我在圖書館看到了這本很薄的書 -- 《深入理解 C 指針》
這本書中寫的內容,個人感覺適合一個初學者,內容不是很難。我也讀了下,對每一章都做了筆記,筆記都是用代碼的形式貼出來。
Chapter1.h
#ifndef __CHAPTER_1_ #define __CHAPTER_1_ /*《深入理解C指針》學習筆記 -- 第一章*/ /*一個數如果是無符號的,那麼盡量去選用 size_t 類型*/ /*使用 size_t 類型的時候一定要用對了輸出格式*/ void __size_t_test(); //對指針進行加的操作就是指針原來指向的地址加上數據類型的大小乘以加的那個數 //對指針進行減的操作就是指針原來指向的地址減去數據類型的大小乘以減的那個數 void __pointer_add_sub_test(); /*指針用 const 修飾的各種表現*/ void __const_to_pointer(); #endif
Chapter1.cpp
#include "Chapter1.h" #include/*一個數如果是無符號的,那麼盡量去選用 size_t 類型*/ /*使用 size_t 類型的時候一定要用對了輸出格式*/ void __size_t_test() { size_t test1 = -1; printf("test1 : %d\n", test1); printf("test1 : %u\n", test1); size_t test2 = 1; printf("test2 : %d\n", test2); printf("test2 : %u\n", test2); /* 輸出結果如下: test1 : -1 test1 : 4294967295 test2 : 1 test2 : 1 */ } //對指針進行加的操作就是指針原來指向的地址加上數據類型的大小乘以加的那個數 //對指針進行減的操作就是指針原來指向的地址減去數據類型的大小乘以減的那個數 void __pointer_add_sub_test() { int test1 = 1; int* p_test1 = &test1; char test2 = 'a'; char* p_test2 = &test2; printf("p_test1 - 1 address is : %x\n", p_test1 - 1); printf("p_test1 address is : %x\n", p_test1); printf("p_test1 + 1 address is : %x\n", p_test1 + 1); printf("\n"); printf("p_test2 - 1 address is : %x\n", p_test2 - 1); printf("p_test2 address is : %x\n", p_test2); printf("p_test2 + 1 address is : %x\n", p_test2 + 1); /* 輸出結果如下: p_test1 - 1 address is : 2dfdb8 p_test1 address is : 2dfdbc p_test1 + 1 address is : 2dfdc0 p_test2 - 1 address is : 2dfda6 p_test2 address is : 2dfda7 p_test2 + 1 address is : 2dfda8 */ } void __const_to_pointer() { /*指向常量的指針*/ /*這裡的指向常量只是指針認為是指向常量的*/ int test1 = 1; const int test2 = 2; /*這兩個操作都是可以的,但是不能解引用而修改它*/ const int* p_test1 = &test1; const int* p_test2 = &test2; test1 = 3; /*這個是可以的*/ // *p_test1 = 3; 但是這個不行 /*指向非常量的常量指針*/ int test3 = 3; int* const p_test3 = &test3; /*指針只能指向非常量,因為可以用解引用修改變量的值*/ // p_test3 = &test1; 同時,指針的值不能被修改 // int* const p_test4 = &test2; 指針只能指向一個非常量,因為可以被修改 /*指向常量的常量指針*/ const int* const p_test4 = &test2; /*代表指針的指向和指針指向的值都不能被修改*/ }