踏雪有痕-指针





1、
每个指针都有一个相关的类型,不同数据类型的指针之间的区别不是在指针的表示上,也不是在指针所持有的值地址上——对所有类型的指针这两方面都是相同的。
  
不同之处在于指针所指的对象的类型上,指针的类型可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。

2、
考虑下面语句,两个变量分别是什么类型:
  int    ii1,  * ii2;

3、
指针持有0时,代表它没有指向任何对象,
main()
{
    
int ival = 1024;
    
int *pi;

    pi
=&ival;            //利用取地址符&给指针赋值
    cout<<*pi<<" ";    //1024
    *pi=0;                //直接给指针赋值
    cout<<*pi<<" ";    //0
    
//pi=0;                //指针不指向任何对象
    
//cout<<*pi<<" ";    //报错
}



考虑下面语句:  
int  ival  =   1024 ;  
int   * pi =& ival;    // ok, *pi=1024
int   * pi1;
* pi1 =& ival;      // error,无法编译通过


4、
指针不能被初始化或赋值为其他类型对象的地址值,虽然这样做并无什么不可能,但不同数据类型对内存的存储布局和内容的解释完全不同。
上述要求有一个特例:空
类型
指针(void*),它可以被任何数据指针类型的地址值赋值(注意,函数指针不可赋值给她)。
main()
{
    
int ival = 1024;
    
int *pi=&ival;
    
void *pv;
    pv
=pi;

    cout 
<< *(int *)pv <<" ";    //1024
}



反之当然不可以:
main()
{
    
int ival = 1024;
    
int *pi=&ival;
    
void *pv;
    pv
=pi;

    
int *pi2;
    pi2
=pv;      //报错,使用类型转换当然可以:pi2=(int *)pv;

    cout 
<< *pi2 <<" ";
}

5、
指针可以让他的地址值增加或减少一个整数值,成为指针的算术运算,实际的增加数值与指针的类型密切相关。
大多数情况下,只有指针指向数组元素时,指针运算才有意义。
例如数组遍历:
int   ia[ 10 ];
int   * iter  =   & ia[ 0 ];
int   * iter_end  =   & ia[ 10 ];    // ???是ia[10]

while (iter  !=  iter_end)
{
     do_something_with_value(
*iter);
     
++iter;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值