- 数组的本质
数组是一段连续的内存空间;
数组的空间大小为sizeof(array_type)*array_size;
数组名可看做指向数组第一个元素的指针常量。
问题:
a + 1的意义是什么?结果是什么?
指针运算的意义是什么?结果是什么?
#include<stdio.h>
int main()
{
int a[5] = {1, 2};
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));
}
运行结果:
%p是打印地址的,%x是以十六进制形式打印,完全不同!另外在64位下结果会不一样(%x在64位系统输出还是32位的)。
2. 指针的运算
指针是一种特殊的变量,与整数的运算规则为 :
p + n; — (unsigned int)p + n * sizeof( *p );
结论:当指针p指向—个同类型的数组的元素时: p+1 将指向当前元素的下—个元素;p -1将指向当前元素的上—个元素。
指针之间只支持减法运算 , 参与减法运算的指针类型必须相同,运算规则为 : p1 - p2; — ( (unsigned int)p1 - (unsigned int)p2 ) / sizeof(type);
注意:
只有当两个指针指向同—个数组中的元素时,指针相减才减有意义,其意义为指针所指元素的下标差
当两个指针指向的元素不在同一个数组中时,结果未定义
指针的比较
指针也可以进行关系运算(<, <=,>,>=)
指针关系运算的前提是同时指向同—个数组中的元素
任意两个指针之间的比较运算(==,!=)无限制
参与比较运算的指针类型必须相同
#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);
//printf("%d\n", p0 + p2); // error
printf("%d\n", p0 - p2); // 虽然编译通过,但结果不可预期
printf("%d\n", p0 - p); // error
printf("%d\n", p0 * p2); // error
printf("%d\n", p0 / p2); // error
return 0;
}
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); // 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.小结
数组声明时,编译器自动分配一片连续的内存空间
指针声明时只分配了用于容纳地址值的4个字节空间(32位系统,64位占8个字节)
指针和整数可以进行运算,其结果为指针,公式为:p+n; <==> (unsigned int)p + n * (sizeof( * p))
当指针指向同一个数组时,指针之间支持减法运算,其结果为数组元素下标差
指针之间支持比较运算,其类型必须相同
————————————————
版权声明:本文为CSDN博主「小虾米_2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22847457/article/details/99286790