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


YingLi
6 声望4 粉丝

From zero to hero.