数组的本质:
·数组是一段连续的内存空间
·数组的空间大小为为sizeof(array_type)*array_size
·数组名可看做指向数组第一个元素的常量指针
例子28-1:
include "stdio.h"
int main()
{
int a[5] = {0};
int* ,p = NULL;
printf("a = 0x%x\n",(unsigned int)(a));
printf("a + 1 = 0x%x\n",(unsigned int)(a + 1));
printf("p = 0x%x\n",(unsigned int)(p));
printf("p + 1 = 0x%x\n",(unsigned int)(p + 1));
}
输出结果:
a = 0xfbfc20
a + 1 = 0xfbfc24
p = 0x0
p + 1 = 0x4
指针运算的结果还是一个值,是一个地址值
指针的运算
·指针是一种特殊的变量,与整数的运算规则为
p+n;⬅➡(unsigned int)p + nsizeof(p);
指针P+n就等于指针p所保存的地址值+n*所指向类型的大小
int *p = null;
p + 1 ==> 0 + 1 sizeof(p) ==> 0 + 1 * sizeof(int) ==> 4
a = 0xfbfc20
a + 1 = 0xfbfc20 + 1 sizeof(a) = 0xfbfc20 + 1 sizeof(a[0]) = 0xfbfc20 + 1 sizeof(int) = 0xfbfc24
结论:当指针p指向一个同类型的数组的元素时:P+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素
·指针之间只支持减法运算
·参与减法运算的指针类型必须相同
p1-p2;⬅➡((unsigned int)p1 - (unsigned int)p2)/sizeof(type);
注意:
1.只有当两个指针指向同一个数组的元素时,指针相减才有意义,其意义为指针所指元素的下标差
2.当两个指针指向的元素不在同一个数组中,结果为定义
指针的比较
·指针也可以进行关系运算(<,<=,>,>=)
·指针关系运算的前提是同时指向同一个数组中的元素
·任意两个指针之间的比较运算(==,!=)无限制
·参与比较运算的指针类型必须相同
例子28-2:
include "stdio.h"
int main()
{
char s1[] = {'H','e','l','l','o'};
int i = 0;
char s2[] = {'W','o','r','l','d'};
char* p0 = s1;
char* p1 = &s1[3];
char* p2 = s2;
int* p = &i;
printf("%d\n",p0 - p1); //ok,-3 下标值相减
//printf("%d\n",p0 + p2); //error 仅支持减法
printf("%d\n",p0 - p2); //error 无意义,不指向同一数组元素
//printf("%d\n",p0 - p); //error 定义类型不同
//printf("%d\n",p0 * p1); //error 仅支持减法
//printf("%d\n",p0 / p1); //error 仅支持减法
}
输出结果:
-3
28
补充:
define countof(a) (sizeof(a)/sizeof(*(a))) 计算数组内的成员个数
a 是一个int型数组,有10个元素,sizeof(a) 就是 a数组整个的存储字节数,10*4=40
*a相当于a[0], 数组第一个元素,
sizeof(*a) 就相当于sizeof(a[0]) =4。
sizeof(a) / sizeof(*(a))=10
例子28-3:
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);
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;
}
输出结果:
pBegin = 008FFB34
pEnd = 008FFB39
Size: 5
Hello
注释:
1.pEnd = s + DIM(s);
s + 5 = 008FFB34 + 5 sizeof(s) = 008FFB34 + 5 sizeof(char) = 008FFB34 + 5 1 = 008FFB39 (结果相同)
2.pEnd指向最后一个元素的下一个
小结:
·数组声明时编译器自动分配一片连续的内存空间
·指针声明是只分配了用于容纳地址值的4字节空间
·指针和整数可以进行运算,其结果为指针
·指针之间只支持减法运算,其结果为数组元素下标值
·指针之间支持比较运算,其类型必须相同
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。