第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 ", (unsigned long)a); // a = 0x7FFF043D43A0 9 printf("a + 1 = 0x%lX ", (unsigned long)(a + 1)); // a + 1 = 0x7FFF043D43A4,a[1]的地址 10 11 printf("p = 0x%lX ", (unsigned long)p); // p = 0x0 12 printf("p + 1 = 0x%lX ", (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 ", p0 - p1); // -3 14 // printf("%ld ", p0 + p2); // compile error,指针之间不允许加法运算 15 printf("%ld ", p0 - p2); // 语法正确,但是p0和p2指向两个不同的数组,结果没有意义 16 // printf("%ld ", p0 - p); // compile error,不同类型指针之间不能相减 17 // printf("%ld ", p0 * p2); // compile error,指针之间不允许乘法运算 18 // printf("%ld ", 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 ", pBegin); 14 printf("pEnd = %p ", pEnd); 15 16 printf("Size: %ld ", pEnd - pBegin); // 5 17 18 for (p = pBegin; p < pEnd; p++) // Hello 19 { 20 printf("%c",*p); 21 } 22 23 printf(" "); 24 25 return 0; 26 }