zoukankan      html  css  js  c++  java
  • 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编程打下坚实的基础~~~~

  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4011345.html
Copyright © 2011-2022 走看看