c语言指针

指针(poont)是一种变量,该变量可以记录另一个变量的地址

定义 

int i=0;
int *p=&i;

注意,*p是连在一起的,而不是int*。因此要定义两个指针 int*p,*q

*p作为一个整体,是一个整数

如果*p的地址是变量i的地址,可以称为p指向i

普通变量的值是实际的值,而指针变量的值是一个实际变量的地址 

 在函数里,定义指针变量作为参数时也是int*p ,在传值给函数时要用 &i

由于函数的变量有自己的变量空间,因此要改变一个函数里的变量值,要用到指针来访问变量的地址,以此可以跨过变量空间来更改变量的值

 单目运算符 * ,用来访问指针的值所代表的地址上的变量

运用

void swap(int *pa,int *pb) //交换变量的函数//
{ int t;
t=*pa;
*pa=*pb;
*pb=t;
}
//调用该函数//
swap(&a,&b)

使用输入的参数是需要保存带回(return)的变量,此时即可使用指针来保存变量

当函数返回值不止一个时,也要使用指针来保存

指针常见误区

定义指针后必须给定其值,也就是这个指针要指向一个变量的地址。如果不赋值就使用,例如直接给没有提前赋值的指针赋值,就可能会出现程序崩溃(如果没有初始化该指针地址就不明确,有的地址时不能随便改的)

在函数参数中的数组实际上就是指针,所以 int sum(int *a)和int sum(int a[])是等价的,甚至可以没有a,只有*和[ ]也行

实际上,数组const的指针,数组变量本身表达一个地址,不能被赋值,所以数组无需&来取址 (也就是 int *p=a是可行的),但a[]=b[]是错误的因为数组的const不能被赋值

但是数组的单元是一个变量,要用& 

a==&a[0]

[]也可以对指针用,p[0]=a[0] ,当p所指向的只是一个变量而不是数组时,p[0]就是指这个变量的地址,也可以把这个变量理解为一个长度为1的数组,但实际不是

*也可以对数组用,*a=a[0]

指针是const

const是指针 

 const数组

指针运算

一个指针加1并不是在地址上加1,而是在地址上加上这个指针所指的变量的一个单元的大小,也就是sizeof(*p)。例如int *p=i,假设原i来p是4,p+1 结果是8因为一个sizeof(int)=4

还有一种*(p+1),这种类型的加就是us向后移动一位,但是如果该指针指向的变量不是char而是int之类的所占字节数不是1的变量,这种运算就没有意义。如果指针指向一个数组,那么*(p+n)=a[0+n] 

同理,指针的减法,++,--也是把指针所指的地址移动位

两个指针相减,得到是两个指针所指的地址差/sizeof(指针类型),也就是在两个地址差中间能放下这种类型变量的个数 

*p++ :++的运算优先级高于*,因此*p++是取出p所指的地址的数据,在把p向后移动一个位置、

指针也可以进行比较,实质是指针所指地址的大小比较<,>,<=,>=,!=都可以

关于0地址,0地址是一个特殊的地址不能随意更改,如果要给一个指针初始化0,int *p=null

虽然所以的指针大小都一样,由于指针的类型不同,所以不同的指针之间不能赋值(这是为了避免用错指针)

void*指针,这种指针是一种不知道指向什么东西的指针(也可以说是指向一块空白区域),该指针可以用来被其他指针赋值,或者是强制类型转换,例如int *p=&i ;void *q=(void *p)  就是把指针p的值赋给q,但是并没有改变p只是用void的形式看待指针p

总结 指针的用处

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值