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