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编程打下坚实的基础~~~~

原文地址:https://www.cnblogs.com/delphi2014/p/4011345.html