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

C语言中的指针(*p p &p)

2009-09-03 16:53 267 查看
在看博客时,无意看到了一篇关于C语言指针的博客议论。虽然写的内容不多,但是自己觉得还是有用,就记下来了。
学习C语言时,指针的学习是比较难的一部分,常常分辨不了*p p &p 的区别。下面是摘抄别人的一段测试程序。
以下是我的一小段测试用的程序
void test(){
int a=8;
int *p=&a;
p=(int *)malloc(N*sizeof(int));
// printf( "%d/n ",*p);
//a. cout < <&p; //0x0012ff14
//b. cout < <*p; //8
c. cout < <p; //0x000431c50
}

b句输出p所指向的内存单元的值,而a语句和c语句分别输出的是什么呢?
a输出的是p本身所占内存单元的地址么?
c输出的是p所指向的内存单元的地址么?
从测试的结果很容易看出来,*P是一个指针变量,它存储的数据是地址,并且也只能存储地址,所以在给*P赋值时,请您确认等号右边的值是不是一个地址。如果不是,那么您的程序将会出现BUG,(或许您是一位优秀的汇编写手,那么请您处理好该指针变量)。
不错,正如测试者所想的,&p输出的内容是*P指针变量的内存单元地址,而指针变量本身存储的是变量a的内存单元地址;
*P您可以理解为取指向,也就是取指针变量所指向的内存单位的数据,在本例中就是a的值;
而P是一个指针变量,它能存储地址。
另外还要说明的是int *p=&a;等价于int *p ; p = &a;
如果您是用的linux系统,那么您可以测试一下下面这个程序,您能更加明白。
#include <stdio.h>

int main()
{
int a = 8 ;
int *p = NULL;
p = &a;
printf ("p is %p /n",p);
printf ("*p is %d /n",*p);
printf ("&p is %p /n",&p);
printf ("&a is %p /n",&a);
return (0);
}
应该注意的2点是:
1.给指针只能传地址,不能传值.否则要做强制类型转换.
2.在做类型转换和赋值时候,应该注意赋值的类型匹配.
知识源于积累。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: