第28课 - 指针和数组分析(上)

第28课 - 指针和数组分析(上)

1. 数组的本质

(1)数组是一段连续的内存空间

(2)数组的大小为 sizeof(array_type) * array_size

(3)数组名可以看作指向数组第一个元素的指针常量

思考下面两个问题:

  ① a + 1的意义是什么?结果又是什么?

  ② 指针运算的意义是什么?结果又是什么?

【a+1的结果是什么?】

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a[5] = {0};
 6     int *p = NULL;
 7 
 8     printf("a = 0x%lX\n", (unsigned long)a);    // a = 0x7FFF043D43A0
 9     printf("a + 1 = 0x%lX\n", (unsigned long)(a + 1));  // a + 1 = 0x7FFF043D43A4,a[1]的地址
10 
11     printf("p = 0x%lX\n", (unsigned long)p);    // p = 0x0
12     printf("p + 1 = 0x%lX\n", (unsigned long)(p + 1));  // p + 1 = 0x4
13 
14     return 0;
15 }

2. 指针的运算

(1)指针是一种特殊的变量,与整数的运算规则为:

   

       当指针p指向一个同类型的数组元素时,p + 1将指向当前元素的下一个元素,p -1指向当前元素的上一个元素。

(2)指针之间只支持减法运算,参与减法运算的指针类型必须相同

        对于数组而言,只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差。当两个指针指向的元素不在同一个数组时,结果未定义。

3. 指针的比较 

(1)指针也可以进行关系运算(<   <=   >   >=   ==   !=

(2)参与关系运算的指针类型必须相同

(3)指针关系运算的前提是:必须指向同一个数组中的元素

【指针运算初探】

 1 #include <stdio.h>
 2 
 3 int main()
 4 {    
 5     char s1[]={'H','e','l','l','o'};
 6     int i=0;
 7     char s2[]={'W','o','r','l','d'};
 8     char* p0 = s1;
 9     char* p1= &s1[3];
10     char* p2 = s2;
11     int*  p = &i;
12     
13     printf("%ld\n", p0 - p1);     // -3
14     // printf("%ld\n", p0 + p2);  // compile error,指针之间不允许加法运算
15     printf("%ld\n", p0 - p2);     // 语法正确,但是p0和p2指向两个不同的数组,结果没有意义
16     // printf("%ld\n", p0 - p);   // compile error,不同类型指针之间不能相减
17     // printf("%ld\n", p0 * p2);  // compile error,指针之间不允许乘法运算
18     // printf("%ld\n", p0 / p2);  // compile error,指针之间不允许除法运算
19   
20     return 0;
21 }

 

【指针运算的应用】

 1 #include <stdio.h>
 2 
 3 // 数组元素的个数
 4 #define DIM(a)  (sizeof(a) / sizeof(*a))
 5 
 6 int main()
 7 {    
 8     char s[]={'H','e','l','l','o'};  
 9     char* pBegin = s;
10     char* pEnd = s + DIM(s);   // 数组末尾的后一个地址
11     char* p = NULL;
12     
13     printf("pBegin  = %p\n", pBegin);
14     printf("pEnd  = %p\n", pEnd);
15   
16     printf("Size: %ld\n", pEnd - pBegin); // 5
17     
18     for (p = pBegin; p < pEnd; p++)  // Hello
19     {
20          printf("%c",*p);
21     }
22 
23     printf("\n");
24   
25     return 0;
26 }

 

posted @ 2019-11-13 23:00  Hengs  阅读(217)  评论(0编辑  收藏  举报