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

    在看博客时,无意看到了一篇关于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.在做类型转换和赋值时候,应该注意赋值的类型匹配.
知识源于积累。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值