1. 程式人生 > >數據結構復習之開題篇(必要時持續更新...)

數據結構復習之開題篇(必要時持續更新...)

ptr ++ 數組 第一個元素 賦值 red ble 1.3 算術

在復習數據結構之前有必要復習一下C語言的指針

1.指針

int* p;
一個指針類型,名為p,代表的是一個整形所存放的地址編號

1.1一個使用的實例

【註】對變量使用&操作符,意為取它所在的地址

 1 #include <stdio.h>
 2  
 3 int main()
 4 {
 5    int var = 20;   /* 實際變量的聲明 */
 6    int* ip;        /* 指針變量的聲明 */
 7  
 8    ip = &var;  /* 在指針變量中存儲 var 的地址 */
 9  
10    printf("Address of var variable: %p\n
", &var ); 11 12 /* 在指針變量中存儲的地址 */ 13 printf("Address stored in ip variable: %p\n", ip ); 14 15 /* 使用指針訪問值 */ 16 printf("Value of *ip variable: %d\n", *ip ); 17 18 return 0; 19 }

1.2一個容易搞混的東西

int* p = NULL;
意為對指針p賦值為NULL,而不是對*p賦值

1.3指針的算術運算

假設p是一個指向地址為1000的整形指針,是一個32位整數
讓我們對該指針執行下列的算術運算:
    p
++; 在執行完上述的運算之後,p 將指向位置 1004,因為 p 每增加一次,它都將指向下一個整數位置,即當前位置往後移 4 個字節。這個運算會在不影響內存位置中實際值的情況下,

移動指針到下一個內存位置。如果 p 指向一個地址為 1000 的字符,上面的運算會導致指針指向位置 1001,因為下一個字符位置是在 1001

1.3.1遞增一個指針

 1 當一個指針指向一個數組時,當遞增該指針時,表示指向數組的下一項
 2 #include <stdio.h>
 3 
 4 const int MAX = 3;
 5 
 6 int main ()
 7 {
 8    int  var[] = {10
, 100, 200}; 9 int i, *ptr; 10 11 /* 指針中的數組地址 */ 12 ptr = var; 13 for ( i = 0; i < MAX; i++) 14 { 15 16 printf("存儲地址:var[%d] = %x\n", i, ptr ); 17 printf("存儲值:var[%d] = %d\n", i, *ptr ); 18 19 /* 移動到下一個位置 */ 20 ptr++; 21 } 22 return 0; 23 } 24 25 /* 輸出的結果為 */ 26 存儲地址:var[0] = bf882b30 27 存儲值:var[0] = 10 28 存儲地址:of var[1] = bf882b34 29 存儲值: var[1] = 100 30 存儲地址:of var[2] = bf882b38 31 存儲值:var[2] = 200

1.3.2指針的比較

指針可以用關系運算符進行比較,如 ==、< 和 >。如果 p1 和 p2 指向兩個相關的變量,比如同一個數組中的不同元素,則可對 p1 和 p2 進行大小比較

下面的程序修改了上面的實例,只要變量指針所指向的地址小於或等於數組的最後一個元素的地址 &var[MAX - 1],則把變量指針進行遞增

 1 #include <stdio.h>
 2 
 3 const int MAX = 3;
 4 
 5 int main ()
 6 {
 7    int  var[] = {10, 100, 200};
 8    int  i, *ptr;
 9 
10    /* 指針中第一個元素的地址 */
11    ptr = var;
12    i = 0;
13    while ( ptr <= &var[MAX - 1] )
14    {
15 
16       printf("Address of var[%d] = %x\n", i, ptr );
17       printf("Value of var[%d] = %d\n", i, *ptr );
18 
19       /* 指向上一個位置 */
20       ptr++;
21       i++;
22    }
23    return 0;
24 }

數據結構復習之開題篇(必要時持續更新...)