指针和数组分析(上)
- 数组的本质
- 数组是一段连续的内存空间
- 数组的空间大小为sizeof(arrary_type)*arrary_size
- 数组名可看做指向数组第一个元素的常量指针
- 问题:
- a+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));
return 0;
}
运行结果:
a = 0x55FDF8
a+1 = 0x55FDFC
p = 0x0
p+1 = 0x4
请按任意键继续. . .- 指针的运算
- 指针是一种特殊的变量,与整数的运算规则为: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>
#define DIM(a) (sizeof(a)/sizeof(*a))
int main()
{
char s[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};
char*pbegin = s;
//如果有一个指针指向了数组最后一个元素的后一个地址,那么这个
//地址是C语言中的一个擦边球地址
char*pend = s+DIM(s);
char*p = NULL;
printf("pbegin=%p\n",pbegin);
printf("pend=%p\n",pend);
printf("数组元素个数=%ld\n",DIM(s));
for(p=pbegin;p<pend;p++)
{
printf("%c",*p);
}
printf("\n");
return 0;
}
运行结果:
:~$ gcc main.c
:~$ ./a.out
pbegin=0x7ffe6de0f620
pend=0x7ffe6de0f625
数组元素个数=5
hello- 小结:
- 数组声明时编译器自动分配一片连续的内存空间
- 指针声明时只分配了用于容纳地址值的4字节空间
- 指针和整数可以进行运算,其结果为指针
- 指针之间只支持减法运算,其结果为数组元素下标差
- 指针之间支持比较运算,其类型必须相同
相关推荐
csdnyasin 2020-06-28
yunfeitian 2020-05-08
jeonkc 2020-05-06
徐建岗网络管理 2020-05-03
xuguiyi00 2020-04-22
qingsongzdq 2020-04-20
shangs00 2020-04-15
penkgao 2020-06-13
qscool 2020-06-12
fengjing81 2020-06-06
AaronPlay 2020-06-02
lynjay 2020-06-02
twater000 2020-05-29
徐建岗网络管理 2020-05-13
qingsongzdq 2020-05-07
lynjay 2020-05-03
shangs00 2020-04-27
qscool 2020-04-18
GoatSucker 2020-04-11