• C++ 之 第六课 指针和数组


       c++语言中大部分程序都离不开指针和数组,所以,我们有必要弄清楚指针和数组。

      首先定一个字符数组char s[10];然后定义一个指向字符的指针char* p;数组用[]来申明,而*则表示指针。数组是以0作为下标开始,s有10个元素,从s[0]...s[9]。指针可以保存它的地址如:

    p = &s[1];// 这句话表示了p指向了s的第2个元素。&是取地址运算符。

      那么指针到底是什么东西?为什么它会有如此大的魔力?如果你了解了汇编的基础知识。其实也不难理解?简单的解释就是它保存了一个对象的地址。这个对象是什么类型的,它也就保存了什么类型。如

    char c = 'a';

    char* p = &c  //p保存着c的地址

    如图所示:

    我们在看看其他的类型的指针

    int * p    //保存了int的指针

    char** ppc   //到字符指针的指针(也就是2级指针)

    int* ap[10];  //10个到int的指针数组

    int(*fp)(char*);   //到函数的指针,这种函数以char*为参数

    int* f(char*);    //有一个char* 参数的函数,返回一个到int的指针

      下面来理解以下最基本的指针操作

    char c = 'a';

    char* p = &c;  //p保存了c的地址

    char c2 = *p; //c2=='a'

      这里的p指向了变量c,而c所存的值是字符‘a’,那*p则保存了字符‘a’,而c2也是*p,所以c2也就等于'a',这里c2做了一项隐蔽的工作,间接的把把地字符'a'给了c2。

    还有一种特殊的指针就是空指针 char* c =null

     它表示指针c没有指向任何对象,如果它某个系统中的运行程序地址,就会出现很可怕的错误!

         数组

    数组也很重要,数组有一维数组和二维数组,甚至多维数组,数组的种类也很多,有字符数组,整形数组,浮点型数组。。。等等。举例说明:

    float a[3];    //定义了一个浮点型数组,有3个元素,从a[0],a[1],a[2]结束,数组下标从0开始,到n-1结束。

    其他类似不再一一举例说明。我们再来看看一些错误的例子:

    int v[i];   //这里的i不能为变量,数组的大小必须是常量表达式

    int v1[5,2]  //这里定义错误,逗号不能出现在常量表达式中。

      数组的初始化

    int v1[]  ={1,2,3,4};

    char v2[] = {'a','b','c',0};

      当数组中没有给出数组大小,但是初始化时的大小可以通过列表中的元素个数确定,v1和v2的个数都为4个,其中v1是int类型,v2是char类型。

      初始化时经常犯的一些错误

    如 char v = {'a','b',0};   //这里的v不是数组。

      字符串数组

      char* p = "plato";

      p[4] = 'e'   //错误,不能将常量赋值

        如果希望字符串能够被修改我们可以将字符复制到数组中

      char p[] = "zero";    //p 是5个char的数组

      p[0] = 'R';    //正确

      数组的指针

      在c++中,指针和数组密切相关,一个数组的名字可以作为开始元素的指针如:

      int v[] = {1,2,3,4};

      int* p1 = v;

      int* p2 = &v[0];

      int* p3 = &v[4];

      这样是允许,,它取得超出了一个数组结束之后的一个元素位置的指针。当然,这个指针事实上并不指向数组中最后一个元素。因为不能通过它读和写。这里一定要注意就行了!

      c++指针和常量

      常量指针用const来修饰,如 const int* p; 这里的*p一旦被定义后其值是不能被修改的。举例说明:

      void f(char* p)

    {

      //1种情况

      char s[] = "Gorm";

      const char* ps = s;  //指向常量

      ps[3] = 'a';   //错误  常量不能被赋值

      ps = p;      //正确

      //2种情况 

      char *const ps = s;   //这是一个常量指针

      ps[3] = 'a'       //正确

      ps = p;      //错误 因为ps是一个常量指针

      //3种情况

      const char* const ps = s;    //到const的const指针

      ps[3] = 'a';      //错误 ps是一个指向常量

      ps = p;    //错误,ps本身是个常量。  

    }

      指向Void的指针 

      void类型的指针就是任何对象的指针都可以指向void类型的指针,这句话听起来很拗口,我们来一个实例具体分析

      void f(int* p)

    {

      void* ps = p;   //正确   从int* 到void*是可以的

      *ps;    //错误 void* 不能间接使用

      ps++;       //错误 void* 因为ps没有指向对象的大小

    } 

      要想学好C++中指针需要大量的练习,从错误中寻找经验,分析原因,只有这样,才能不惧怕指针。因此,我们更应该去努力的学会它,为我们学好Windows编程打下坚实的基础~~~~

  • 相关阅读:
    OData的初步认识
    ABP源码分析二十五:EventBus
    ABP源码分析二十四:Notification
    ABP源码分析二十三:Authorization
    ABP源码分析二十二:Navigation
    ABP源码分析二十一:Feature
    160. 相交链表
    83. 删除排序链表中的重复元素
    21. 合并两个有序链表
    字典(dict)常用操作
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4011345.html
Copyright © 2020-2023  润新知