您的位置:首页 > 编程语言 > C语言/C++

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

2014-10-08 15:42 239 查看
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编程打下坚实的基础~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: