• 指针和数组分析(上)


    • 数组的本质
    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. 指针之间支持比较运算,其类型必须相同
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    [转载]instanceof和typeof区别
    【转载】DNN架构
    Delphi实现高性能的Socket通讯服务器(完成端口模型IOCP)
    record, packed record和变体记录
    Delphi操作Word的几个知识点
    WinSock学习笔记6:IOCP完成端口模型
    MyEclipse 常用设置和操作方法
    PAIP.一些流氓软件的流氓营销方法.txt
    qq安全使用指南.txt
    海量数据高性能分页
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177717.html
Copyright © 2020-2023  润新知