C/C++指针

本文中提供的代码只是便于理解指针,在实际应用中不建议使用

指针就是一个无符号整形变量

注意在c与c++中将一个指针赋值给一个int变量时要强制类型转换

例如:

int main()  
{  
    char *p = new char[100] ;  
    memset(p ,0,sizeof(p));  
    strcpy(p,"this is a char pointe");  
    int a = (int)p ;  
    if (a == (int)p)  
    {  
        printf("a == (int)p\n");  
    }  
  
    if (p == (char*)a)  
    {  
        printf("p == (char*)a\n");  
    }  
    printf("p = %x,a= %x\n",p,a);  
    printf("p = %s, (char*)a = %s\n",p,(char*)a);  
  
    p = new char[100] ;  
    int b = (int)p ;  
    strcpy((char*)b,"this is a point b");  
    printf("p = %s,a = %s,b = %s\n",p,(char*)a,(char*)b);  
    p = (char*)a ;  
    printf("a = %s\n",p);  
    delete((char*)b); //释放第二次new出来的指针;  
    delete((char*)a);//释放第一次new出来的指针;  
    printf("delete ok\n");  
    //printf("p = %s",p);//输出一串乱码或段错误 ,p 被 delete掉了 指向的是一块野指针;  
    p = NULL ; //NULL 就是常量 0 ;  
    //delete(p); 错误  删除一个没有开辟的内存块;  
    a = 0x5678 ;  
    p = (char*)a ; //p指向了一块野指针;  
  
} 


在系统当中,任意一个常数都是一个野指针(寄存器的地址,程序中变量或常量的地址除外),特殊的 NULL (0)是空针。

为什么指针的大小为4个字节?

因为指针保存的是一块内存的地址,地址就是一个无符号的整数,所以为4个字节。

在c++中传递参数时为什么传递指针时值有可能不会被返回,传递引用时一定会被返回?

原因见代码:


int fun1(int* a)  
{  
    *a = 1 ; //改变a所指的对象的值,并没有改变a的值;  
    printf("a = %d fun1\n",*a);  
    return 0 ;  
}  
  
int fun2(int *a)  
{  
    int* p = new int ;  
    *p = 8 ;  
    a = p ; //改变了a的指向,及改变了a的值;  
    printf("a = %d fun2\n",*a);  
    return 0 ;  
    //指针p没有被释放;  
}  
  
int fun3(int* &a)  
{  
    int* p = new int ;  
    *p = 8 ;  
    a = p ; //改变了a的指向,及改变了a的值;  
    printf("a = %d fun3\n",*a);  
    return 0 ;  
}  
  
int main()  
{  
    int* a = new int ;  
    *a = 0 ;  
    fun1(a);     // a的值改变,改变的是a所指对象的值,不是a的值;  
    printf("fun1 a = %d\n",*a);  
    fun2(a);    //a的值不会改变,fun2中改变的是a的值而不是*a的值(相当于传递了一个变量);  
    printf("fun2 a = %d\n",*a);  
    int*p = a ;  
    fun3(a);    //a的值改变,fun3接收的为引用改变的是a的值而不是*a的值;  
    printf("fun3 a = %d p = %d\n",*a,*p);  
    delete a ;  
    delete p ;  
}  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值