指针和数组分析(上)

Posted chengeputongren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针和数组分析(上)相关的知识,希望对你有一定的参考价值。

  • 数组的本质
  1. 数组是一段连续的内存空间
  2. 数组的空间大小为sizeof(arrary_type)*arrary_size
  3. 数组名可看做指向数组第一个元素的常量指针
  • 问题:
  1. a+1的意义是什么?结果是什么?
  2. 指针运算的意义是什么?结果又是什么?
 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 请按任意键继续. . .
  • 指针的运算
  1. 指针是一种特殊的变量,与整数的运算规则为:p+n <==> (unsigned int)p +n*sizeof(*p);
  2. 结论:当指针p指向一个同类型的数组元素时:p+1将指向当前元素的下一个元素,p-1将指向当前元素的前一个元素。
  • 指针之间的减法运算
  1. 指针之间支持减法运算
  2. 参与减法运算的指针类型必须相同
  3. 注意:只有当指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差。
  4. 当两个指针指向的元素不在同一个数组中时,结果未定义。
    p1 - p2 《=》((unsigned int p1) - (unsigned int p2))/sizeof(type)
  • 指针的比较运算
  1. 指针也可以进行关系运算(< ,<=,>,>=)
  2. 指针关系运算的前提是指向同一个数组中的元素
  3. 任意两个指针之间的比较运算(==   !=)无限制
  4. 参与比较运算的指针类型必须相同
#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
  • 小结:
  1. 数组声明时编译器自动分配一片连续的内存空间
  2. 指针声明时只分配了用于容纳地址值的4字节空间
  3. 指针和整数可以进行运算,其结果为指针
  4. 指针之间只支持减法运算,其结果为数组元素下标差
  5. 指针之间支持比较运算,其类型必须相同
 

以上是关于指针和数组分析(上)的主要内容,如果未能解决你的问题,请参考以下文章

指针和数组分析(下)

第29课 指针和数组分析(下)

第29课 指针和数组分析(下)

斐波那契数和数小方块的类型题分析方法

7.多关联双亲染色体片段代换系(CSSL)群体的代谢组分析

带你搞懂指针和数组方面的相关例题