zoukankan      html  css  js  c++  java
  • 指针和数组分析(上)

    • 数组的本质
    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. 指针之间支持比较运算,其类型必须相同
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    关注Imagine cup 2010Palantir智能公交系统
    Windows Media Player Application Sample Code Analysis (Mobile 6.5.3)
    Oracle客户端穿过防火墙连接服务器
    国内最大的IT门户天极网也采用了博客园的.TEXT程序
    基于深度优先的递归判断域用户是否是某个组的成员
    Oracle外部身份认证研究
    在Oracle中用存储过程发中文的HTML邮件
    cnblogs .text系统配置主要操作简介
    适合于初学者的一些小技巧
    我在cnblog .text基础上做的适应性修改
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177717.html
Copyright © 2011-2022 走看看