c/c++指针



在c/c++里指针是一个比较复杂的东西,很容易把人弄晕,但是只要我们耐心的学习和分析,也可以把指针弄的明明白白,清清楚楚。

先从最简单的看起,比如声明

int *a;

这样一个变量。这里a是一个指针变量,它占有4个字节的内存,里面存放的是一个地址,这个内存地址的位置可以存放一个int型的变量。

*a这个表达式就是一个int型的值,在a前面加一个*可以称作对a解除引用,单独的使用a代表的是其中存放的地址。

如何给a赋值呢,假如之前已有了int b=5,那么就可以使用

a=&b;

&b中的&操作符表示取b的地址。如果a中已经有了一个地址,并且它所指向的内容不是const型的,可以用

*a=8;

这种形式直接给a所指向的int变量赋值,关于const,我们稍后再看。

前面的声明表示a是一个int*型的变量,那么如果不小心将另一种变量的地址赋给了a会怎么样呢,比如

char c=‘x’;

a=&c;

地址都是4个字节的,所以这种赋值看起来是可以的,但是编译器会报错。我们仔细分析一下,c只占1个字节,而a所指向的内容是int型变量,要占4个字节,如果可以将c的地址赋给a,那么a所指向的内容包括c和c后面3个字节,但是c后面3个字节并没有分配,所以系统不允许这样的操作。那如果反过来,将int型变量的地址赋给char *类型变量呢,比如

int a=5;

char *c=&a;

a占有4个字节,c所指向的是a中的一个字节,这样就将a截断了,也是不可行的。

不过这种转换可以通过强制转换来实现

int a=5;

char *c=(char *)&a;

有关强制类型转换的更多内容,我们以后再讨论。

我们来看一个特殊一点的指针

int ****a;

其实一步步分析就很清楚,*a表示int***型的指针变量,**a表示int**型指针变量,***a表示int*型指针变量,****a表示整形变量。

回顾前面的const,指针可以是指向常量的指针,比如

int b=5;

const int *a=&b;

表示a是一个指向常变量的指针,不可以使用

*a=9;

这种方式修改a所指向的值,但是可以让a指向另一个int型变量,比如

int c=8;

a=&c;

还有一种常指针

int * const a=&b;

表示a中存放的地址是不能修改的,但a所指向的内容可以修改,可以用

*a=9;

的方式来修改a所指向的内容,但不能给a赋另外的地址。

指针的功能很强大,我们先来说说函数传参,函数传参有值传递和引用传参。

将指针作为参数应该是值传递的一种,但是它和一般的值传递不太一样。比如一个交换函数

void swap(int x,int y)

{

int temp=x;

x=y;

y=temp;

}

如果我们在主函数中调用了这个函数

int a=5;

int b=6;

swap(a,b);

当函数运行完,a和b的值并没有交换,这是因为我们仅仅将a和b的值传给了x,y,x和y实际上是a和b的副本,它们有自己的内存地址,与a,b完全独立,只不过对应的值是一样的。再看看将指针作为参数时

swap(int *x,int *y)

{

int temp=*x;

*x=*y;

*y=temp;

}

主函数中

swap(&a,&b);

将a和b的地址传给指针变量x和y,当然x也有自己的地址,x的地址和a的地址是不同的,但是x中存放的是a的地址,修改x所指向的内容时,也就修改了a的内容,这也是值传递,不过传递的是地址的值。当我们希望在函数中修改实参的值时,可以使用指针作为型参。

当你向系统申请动态内存时,要用指针来保存动态内存的地址,比如

char *p=new char(50);

这样申请了50个字节的内存,不需要这块内存时,还得使用

delete p;

释放掉指针所指向的内存。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值