读书人

关于指针,该怎么处理

发布时间: 2013-01-11 11:57:35 作者: rapoo

关于指针
int a=1011;
int *p_a=&a; //p是存储a在内存中位置的指针

突然想到是否有“指针的指针”这个概念,试了一下:
int *p_p_a=&p_a;
printf("%d\n",p_p_a);
居然还真运行出来了。

这样的话,是不是有“指针的指针的指针的指针.......”。不过好像没啥实际应用价值....
[解决办法]
先理解好指针是变量的地址,就知道指针的指针的指针....是没有问题的了。
因为指针变量存的就是另一个变量的地址, 指针变量本身也有地址,它的地址当然可以存在另一个指针变量中,以此类推。
关于指针,该怎么处理
你到birduu.com这个网站上看看指针这部分吧,是从变量的内存开始讲起的,了解了指针变量的本质,很多问题就迎刃而解了。
[解决办法]
一般只用到三级指针,再深就没有可读性了,指针的本质就是一个地址,不同的指针类型不过是用来决定以何种方式解释这个地址。
举个例吧,假定有一个 void *p,指针p所存储的值是 0x003e7f11, 现在指针p是无类型信息的,如果你用
int *pi = (int *)p;
那么 pi 的值也是 0x003e7f11,但现在 pi 是有类型信息的,如果对 pi 进行解引用,比如执行 int a = *pi;那么计算机把 0x003e7f11 起的四个字节的内容解释成一个整数的存储,按照整数的存储方式把它解释出来赋给a.
如果你把 p 转化成某个结构的指针:
struct Person *me = (struct Person *)p;
假定这里的结构体定义如下:
struct Person
{
int id; /*身份证号*/
char name[20]; /*姓名*/
};
那么指针 me 的值也是 0x003e7f11,但如果对 p 进行解引用,比如
char name_buffer[20];
strcpy(name_buffer, me->name);
第二条语句将从 0x003e7f15(从 0x003e7f11 起偏移四个字节,因为前四个字节是 id 的存储空间) 开始的连续20个字节复制到 name_buffer 中去。
祝你学习愉快。

读书人网 >C语言

热点推荐