数组是相同变量的有序集合,大小为一片连续的内存空间存储元素。数组名可看作一个常量指针,它指向内存中数组首元素的起始地址。虽然数组的地址&a与数组名的值相同,可是表示不同的概念,数组的大小sizeof(*a)*array_size ==sizeof(*a)*(sizeof(a)/sizeof(*a))
因此*(a+i)相当于a[i],
指针是一种特殊类型的变量,存放指向数据变量的地址。其实本质上还是变量,既然是变量就占一定的内存空间,而它的内存空间,好像与地址总线有关。目前的指针大小都占四个字节,以后CPU的发展与操作系统的升级,可能会占更大的内存空间。
指针运算
p + n; == (unsigned int)p + n*sizeof(*p);
当指针p指向一个同类型的数组的元素时: p+1将指向当前元素的下一个元素; p-1将指向当前元素的上一个元素。
当指针p指向一个同类型的数组的元素时: p+1将指向当前元素的下一个元素; p-1将指向当前元素的上一个元素。
指针之间只支持减法运算,且必须参与运算的指针类型必须相同
p1 – p2; ( (unsigned int)p1 - (unsigned int)p2) / sizeof(type);
注意:
只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差
当两个指针指向的元素不在同一个数组中时,结果未定义,可能没有实际意义,主要是两个数组分配的内存空间方式可能不同
p1 – p2; ( (unsigned int)p1 - (unsigned int)p2) / sizeof(type);
注意:
只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差
当两个指针指向的元素不在同一个数组中时,结果未定义,可能没有实际意义,主要是两个数组分配的内存空间方式可能不同
#include <stdio.h>
#include <malloc.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);
//printf("%d\n", p0 + p2);
printf("%d\n", p0 - p2);
//printf("%d\n", p0 - p);
//printf("%d\n", p0 * p2);
//printf("%d\n", p0 / p2);
return 0;
}
结果: