栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

总结 指针的用处

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号