美文网首页c/c++Android开发经验谈程序员
android 源码阅读的C++语法准备3 指针 引用 stru

android 源码阅读的C++语法准备3 指针 引用 stru

作者: richy_ | 来源:发表于2017-12-16 18:45 被阅读27次

    1. 指针

    type *var-name;
    指针的值的实际数据类型是一个代表内存地址的长的十六进制数。

    Null 指针

    在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针,它表明该指针不指向一个可访问的内存位置。

    int  *ptr = NULL;
    if(ptr)     /* 如果 ptr 非空,则完成 */
    if(!ptr)    /* 如果 ptr 为空,则完成 */
    

    指针的算术运算

    ptr++会带来什么?
    int *ptr : 假设指向地址 1000 的整型指针,是一个 32 位的整数,递增一次后,将指向下一个整数位置,即当前位置往后移 4 个字节,1004
    char *ptr : 假设 ptr 指向一个地址为 1000 的字符,递增一次后,将指向下一个字符 1001

    指针的比较

    指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则对 p1 和 p2 进行大小比较是有意义的,否则比较地址值的大小通常没有意义。

    指针 vs 数组

    指针和数组在很多情况下是可以互换的,但注意不能修改数组名的值

    #include <iostream>
    using namespace std;
    const int MAX = 3;
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
       for (int i = 0; i < MAX; i++)
       {
          *var = i;    // 这是正确的语法
          *(var + 2) = i; // 这是正确的语法
          var++;       // 这是不正确的
       }
       return 0;
    }
    

    指针的数组

    int *ptr[MAX];// ptr 中的每个元素,都是一个指向 int 值的指针
     const char *names[MAX] = {
                       "Zara Ali",
                       "Hina Ali",
                       "Nuha Ali",
                       "Sara Ali",
       };//names 的每一个元素都指向一个char类型的指针,可以存储一个字符串列表
    

    指向指针的指针(多级间接寻址)

    int **var;
    指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

    多级间接寻址

    2. 引用

    引用是某个已存在变量的别名。

    引用 vs 指针

    • 不存在空引用。引用必须连接到一块合法的内存。
    • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
    • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
       // 声明简单的变量
       int    i;
       double d;
     
       // 声明引用变量 "&" 读作引用
       int&    r = i;// r 是一个初始化为 i 的整型引用
       double& s = d;// s 是一个初始化为 d 的 double 型引用
    

    引用作为参数和返回值

    通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护

    // 把引用作为参数,会改变内存值
    void swap(int& x, int& y);
    
    //引用作为返回值,要注意被引用的对象不能超出作用域,返回一个对**局部变量**的引用是不合法的
    double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
    double& setValues( int i )
    {
      return vals[i];   // 返回第 i 个元素的引用
    }
    

    3. C++ 日期 & 时间

    #include <ctime>

    四个与时间相关的类型:clock_ttime_tsize_ttm

    #include <iostream>
    #include <ctime>
    using namespace std;
     
    int main( )
    {
       // 基于当前系统的当前日期/时间
       time_t now = time(0);
       // 把 now 转换为字符串形式
       char* dt = ctime(&now);
       cout << "本地日期和时间:" << dt << endl;
       // 把 now 转换为 tm 结构
       tm *gmtm = gmtime(&now);
       dt = asctime(gmtm);
       cout << "UTC 日期和时间:"<< dt << endl;
    }
    

    4. C++ 基本的输入输出

    I/O头文件

    头文件 函数和描述
    <iostream> 该文件定义了 cin、cout、cerrclog 对象,分别对应于标准输入流标准输出流、非缓冲标准错误流和缓冲标准错误流。
    <iomanip> 该文件通过所谓的参数化的流操纵器(比如 setwsetprecision),来声明对执行标准化 I/O 有用的服务。
    <fstream> 该文件为用户控制的文件处理声明服务。

    iostream

    #include <iostream>
     
    using namespace std;
     
    int main( )
    {
       char name[50];
       cout << "请输入您的名称: ";//<< 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项
       cin >> name; //cin >> name >> age;相当于cin >> name; cin >> age;
       cout << "您的名称是: " << name << endl;
       char str[] = "Unable to read....";
      //标准错误流
       cerr << "Error message : " << str << endl;//附属到标准错误设备,通常也是显示屏
      //标准日志流
      clog << "Error message : " << str << endl;
    }
    

    5. Struct 结构

    struct type_name {
    member_type1 member_name1;
    member_type2 member_name2;
    member_type3 member_name3;
    .
    .
    } object_names;
    

    使用成员访问运算符(.)访问

    结构作为函数参数

    可以把结构作为函数参数,传参方式与其他类型的变量或指针类似

    指向结构的指针

    可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似

    struct Books *struct_pointer;
    struct_pointer->title;//使用 -> 运算符,指向该结构的指针 的成员
    

    typedef 关键字

    是一种更简单的定义结构的方式,可以为创建的类型取一个"别名"

    typedef struct
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    }Books;
    typedef long int *pint32;
    
    Books Book1, Book2;
    pint32 x, y, z;
    

    相关文章

      网友评论

        本文标题:android 源码阅读的C++语法准备3 指针 引用 stru

        本文链接:https://www.haomeiwen.com/subject/xbsrwxtx.html