• 第28课


    第28课 - 指针和数组分析(上)

    1. 数组的本质

    (1)数组是一段连续的内存空间

    (2)数组的大小为 sizeof(array_type) * array_size

    (3)数组名可以看作指向数组第一个元素的指针常量

    思考下面两个问题:

      ① a + 1的意义是什么?结果又是什么?

      ② 指针运算的意义是什么?结果又是什么?

    【a+1的结果是什么?】

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a[5] = {0};
     6     int *p = NULL;
     7 
     8     printf("a = 0x%lX
    ", (unsigned long)a);    // a = 0x7FFF043D43A0
     9     printf("a + 1 = 0x%lX
    ", (unsigned long)(a + 1));  // a + 1 = 0x7FFF043D43A4,a[1]的地址
    10 
    11     printf("p = 0x%lX
    ", (unsigned long)p);    // p = 0x0
    12     printf("p + 1 = 0x%lX
    ", (unsigned long)(p + 1));  // p + 1 = 0x4
    13 
    14     return 0;
    15 }

    2. 指针的运算

    (1)指针是一种特殊的变量,与整数的运算规则为:

       

           当指针p指向一个同类型的数组元素时,p + 1将指向当前元素的下一个元素,p -1指向当前元素的上一个元素。

    (2)指针之间只支持减法运算,参与减法运算的指针类型必须相同

            对于数组而言,只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差。当两个指针指向的元素不在同一个数组时,结果未定义。

    3. 指针的比较 

    (1)指针也可以进行关系运算(<   <=   >   >=   ==   !=

    (2)参与关系运算的指针类型必须相同

    (3)指针关系运算的前提是:必须指向同一个数组中的元素

    【指针运算初探】

     1 #include <stdio.h>
     2 
     3 int main()
     4 {    
     5     char s1[]={'H','e','l','l','o'};
     6     int i=0;
     7     char s2[]={'W','o','r','l','d'};
     8     char* p0 = s1;
     9     char* p1= &s1[3];
    10     char* p2 = s2;
    11     int*  p = &i;
    12     
    13     printf("%ld
    ", p0 - p1);     // -3
    14     // printf("%ld
    ", p0 + p2);  // compile error,指针之间不允许加法运算
    15     printf("%ld
    ", p0 - p2);     // 语法正确,但是p0和p2指向两个不同的数组,结果没有意义
    16     // printf("%ld
    ", p0 - p);   // compile error,不同类型指针之间不能相减
    17     // printf("%ld
    ", p0 * p2);  // compile error,指针之间不允许乘法运算
    18     // printf("%ld
    ", p0 / p2);  // compile error,指针之间不允许除法运算
    19   
    20     return 0;
    21 }

    【指针运算的应用】

     1 #include <stdio.h>
     2 
     3 // 数组元素的个数
     4 #define DIM(a)  (sizeof(a) / sizeof(*a))
     5 
     6 int main()
     7 {    
     8     char s[]={'H','e','l','l','o'};  
     9     char* pBegin = s;
    10     char* pEnd = s + DIM(s);   // 数组末尾的后一个地址
    11     char* p = NULL;
    12     
    13     printf("pBegin  = %p
    ", pBegin);
    14     printf("pEnd  = %p
    ", pEnd);
    15   
    16     printf("Size: %ld
    ", pEnd - pBegin); // 5
    17     
    18     for (p = pBegin; p < pEnd; p++)  // Hello
    19     {
    20          printf("%c",*p);
    21     }
    22 
    23     printf("
    ");
    24   
    25     return 0;
    26 }
  • 相关阅读:
    UIImagePickerController 获取相片视频
    plist文件Boolean类型读写方法
    stringstream 用法
    C++11中提供了std::bind
    图像的亮度和对比度调节
    windows C++ 全局异常捕捉函数
    windows 下多线程
    C++11 Lambda表达式(匿名函数)
    图像亮度调节--幂次变换
    SEH:结构化异常处理 学习
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/11853969.html
Copyright © 2020-2023  润新知