要搞清楚指针,先要清楚几个概念,指针的类型,指针所指向的类型,指针的值,指针本身所占的内存区
直接看几个例子吧
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
指针所指向的类型
(1)int*ptr; //指针所指向的类型是int
(2)char*ptr; //指针所指向的的类型是char
(3)int**ptr; //指针所指向的的类型是int*
(4)int(*ptr)[3]; //指针所指向的的类型是int()[3]
(5)int*(*ptr)[4]; //指针所指向的的类型是int*()[4]
指针的类型和指针所指向的类型是两个概念,正确区分这两个概念是精通指针的关键之一。
指针的值是指指针本身存储的数值,这个值将被编译器当做一个地址,指针在32位电脑上是4个字节也就是32个位。指针的值是很重要的,当你定义一个指针之后你要问自己你所定义的指针是指向哪里的,如果还未初始化,也就是说指针所指向的内存区是不存在的毫无意义的。
指针的算术运算。
指针的加减运算与通常的数值加减运算是不一样的,是以单元为单位的。
如以下代码:
char a[13]="Hello World!";
int *ptr=(int *)a;
ptr++;
cout<<*ptr<<endl;
可以看到屏幕上输出的是1867980911,但是不要紧,些如下代码:
char b=(char)1867980911;
cout<<b<<endl;
在屏幕上得到的值是小写的字母o,所以分析以上代码,由于指针一次移动是int也就是4个字节,而在vc中char是占一个字节的,所以才会出现ptr移到o去了。
运算符&和*,这个我想一般的课本上面也应该有讲,&就是去地址运算符,*是间接运算符,例子如下:
int a=12;
int *p=&a;
int **ptr;
ptr=&p;
cout<<&a<<endl;
cout<<p<<endl;
cout<<*ptr<<endl;
cout<<ptr<<endl;
cout<<&p<<endl;
cout<<a<<endl;
cout<<*p<<endl;
cout<<**ptr<<endl;
请读者自己将上面代码敲出来,并且仔细琢磨输出的值为什么会是那么多,我先在此分析一下。
第一行定义一个一个整数a,第二行定义一个指向a的整形指针p,第三行定义了一个二级指针,第四行将p的地址赋给了二级指针ptr。
第五行对a去地址并输出,第六行输出p里面所存的地址,第七行是输出p的值,所以这3行输出的结果是一样的,都是a的地址。
第八行的ptr代表的是p的地址,第九行对p取地址然后输出,所以这两行的值也是一样的。
第十,十一,十二行输出的结果都是a的值,也就是12。
数组和指针的关系,其实一句话就可以概括,数组名即使指针,如下int a[10],数组名a就是一个地址,指向数组第一个位置的地址,
指针与函数的关系,仔细分析下面这个函数就行了,下面的这个程序中a=(*pfun)(str);就是根据函数指针来调用函数的。
int fun(char *s)
{
int num=0;
while(*s!=0)
{
num+=*s;s++;
}
return num;
}
int a;
int (*pfun)(char *);
pfun=fun;
char str[]="abcdefghijklmn";
a=(*pfun)(str);
cout<<a<<endl;
如果读者仔细看了以上内容的话指针这块应该问题不大了,请读者一定要亲自敲代码,实践出真理,要自己体会,否则要想弄清指针还是有困难的。