数组与指针分析
数组的本质
- 数组是一段连续的内存空间
- 数组的空间大小为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字节空间
- 指针和整数可以进行运算,结果为指针
- 指针之间支持减法运算,其结果为数组元素下标差
- 指针之间支持比较运算,其类型必须相同