指针和数组分析(上)
Posted chengeputongren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针和数组分析(上)相关的知识,希望对你有一定的参考价值。
-
数组的本质
-
数组是一段连续的内存空间
-
数组的空间大小为sizeof(arrary_type)*arrary_size
-
数组名可看做指向数组第一个元素的常量指针
-
问题:
-
a+1的意义是什么?结果是什么?
-
指针运算的意义是什么?结果又是什么?
1 #include <stdio.h> 2 int main() 3 { 4 int a[5] = { 0 }; 5 int*p = NULL; 6 printf("a = 0x%X ",(unsigned int)(a)); 7 printf("a+1 = 0x%X ", (unsigned int)(a + 1)); 8 printf("p = 0x%X ", (unsigned int)(p)); 9 printf("p+1 = 0x%X ", (unsigned int)(p + 1)); 10 return 0; 11 } 12 运行结果: 13 a = 0x55FDF8 14 a+1 = 0x55FDFC 15 p = 0x0 16 p+1 = 0x4 17 请按任意键继续. . .
-
指针的运算
-
指针是一种特殊的变量,与整数的运算规则为: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 ",pbegin); printf("pend=%p ",pend); printf("数组元素个数=%ld ",DIM(s)); for(p=pbegin;p<pend;p++) { printf("%c",*p); } printf(" "); return 0; } 运行结果: book@www.100ask.org:~$ gcc main.c book@www.100ask.org:~$ ./a.out pbegin=0x7ffe6de0f620 pend=0x7ffe6de0f625 数组元素个数=5 hello
-
小结:
-
数组声明时编译器自动分配一片连续的内存空间
-
指针声明时只分配了用于容纳地址值的4字节空间
-
指针和整数可以进行运算,其结果为指针
-
指针之间只支持减法运算,其结果为数组元素下标差
-
指针之间支持比较运算,其类型必须相同
以上是关于指针和数组分析(上)的主要内容,如果未能解决你的问题,请参考以下文章