指针学习笔记

   要搞清楚指针,先要清楚几个概念,指针的类型,指针所指向的类型,指针的值,指针本身所占的内存区。

   直接看几个例子吧

   (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个字节,而在vcchar是占一个字节的,所以才会出现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;

文章转摘自我的csdn博客http://blog.csdn.net/wzmlove007/archive/2010/07/22/5756613.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值