数组与指针分析

数组的本质

  • 数组是一段连续的内存空间
  • 数组的空间大小为sizeof(array_type)*array_size
  • 数组名可以看做指向第一个元素的常量指针

指针的运算

指针是一种特殊的变量,与整数的运算规则为
p+n; <--> (unsigned int)p + n * sizeof(*p);
结论
当指针p指向一个同类型的数组的元素时,p+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素。

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

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

例子1:指针运算的应用

#include <stdio.h>  
  
#define DIM(a) (sizeof(a) / sizeof(*a))  
  
int main()  
{  
    char s[] = {'H', 'e', 'l', 'l', 'o'};  
    char* pBegin = s;  
    char* pEnd = s + DIM(s); // Key point  
    char* p = NULL;  
      
    printf("pBegin = %p\n", pBegin);  
    printf("pEnd = %p\n", pEnd);  
      
    printf("Size: %d\n", pEnd - pBegin);  
      
    for(p=pBegin; p<pEnd; p++)  
    {  
        printf("%c", *p);  
    }  
      
    printf("\n");  
     
    return 0;  
}  

指针的比较

  • 指针也可以进行关系比较(<,>,<=,>=)
  • 指针关系运算的前提是同时指向同一个数组中的元素
  • 任意两个指针之间的比较运算(==,=!)无限制
  • 参与比较运算的指针类型必须相同

小结

  • 数组声明时编译器自动分配一片连续的内存空间
  • 指针声明时只分配了用于容纳地址值的4字节空间
  • 指针和整数可以进行运算,结果为指针
  • 指针之间支持减法运算,其结果为数组元素下标差
  • 指针之间支持比较运算,其类型必须相同
posted @ 2018-06-22 14:13  烟云123  阅读(125)  评论(0编辑  收藏  举报