c语言指针写增删改查程序,C语言——指针

原标题:C语言——指针

指针:也可以叫指针变量,与其他类型的变量相同,同样保存一个值,只不过保存的值是一片地址(16进制数)

注:在32位机上,指针统一占4个字节,64位机则占用8个字节,因为指针就是用来保存

地址,所以地址多大,指针就有多大。

一、使用指针需要了解并注意:

因为指针记录的是地址,所以理论上来说,指针就记录了一个16进制数,所以以下操作是合理:

int *p = 0xFFFF10;

但是编译器会报警告,警告的原因是p需要接受一个int *类型的数据,而0xFFFF10是一个立即数,不知道是什么类型的,于是为了骗编译器,所以可以修改代码为:

int *p = (int *)0xFFFF10; //强制数据类型转换

编译和运行以上代码会发现,程序不会有任何错误,这是因为系统允许指针记录任意的地址值,但是对于该指针不要进行读写操作,因为指针指向的内存,当前进程是否有权限操作是不确定的,如果没有权限操作程序会报段错误

二、指针的作用:

1.可以间接访问,提高效率

2.函数传参时直接传地址,更方便,地址传递最大的好处是节约内存开销

3.可以使用堆空间,获取更大的内存操作空间

1:直接访问与间接访问

直接访问:直接访问一个变量名,是访问的内存空间中的值通过变量名做赋值操作,是可以直接修改内存空间中的值。在内存中寻找这个名字的变量,速度慢,效率低。

间接访问:通过记录某个变量的内存地址(通过指针变量来进行保存记录),通过访问该指针可以获取到其内存地址,也可以通过对该指针进行取值操作,获取到指针指向内存空间中的值。直接通过地址找到这个变量,速度快,效率高。

2:函数传参

值传递:对于一些简单的int或者char变量来说,我们直接采用值传递更方便

地址传递:如果要传一个数组,值传递就会很麻烦。再如果需要一个函数指针,那么值

传递就很难实现,所以这个时候我们就需要传递一片地址过去,功能函数直

接对这片空间地址中的数据进行处理就可以了。

3:使用堆空间

栈:由系统管理的一块内存空间,由系统负责分配和释放内存,该内存是可读可写的。

但是这片空间比较小,如果代码中数据过大,可能导致栈不够用。

堆:由用户(开发人员)进行管理的一块内存空间,由用户调用系统调用进行分配和释

放内存空间,是一块可读可写的自由空间。这块空间很大,一般来说已经足够我们

开发使用。而且使用堆空间,用链表操作数据,比在栈上使用数组更容易增删改查,

并且我们可以合理的开辟空间的大小,基本不会造成资源不够或者资源浪费。

三:指针的大小与万能指针

指针的大小:因为指针记录的是地址,所以地址占多少个字节,那么指针的大小也就是多少,比如64位机,指针占用8个字节,

讲道理,8个字节足以保存任意的变量地址。保存是肯定可以保存的,但是在对该指针取值或者赋值的时候就会出现问题

int a=10;-----------1010

char *p=&a;

所以我们可以得出结论,任意数据类型的指针,都可以保存任意类型数据的变量的地址,

但指针的数据类型,是在限制对指针操作时,要从指向内存中获取多少字节的数据,即指针的数据类型就是为了在对指针取值时使用的

所以建议:什么类型的变量的地址,就使用什么类型的指针去指向

由此就可以引出我们的一个空指针类型,也就是万能指针:void *

这个叫做空指针类型,也称之万能指针,万能指针可以保存任意类型变量的地址,也可以将万能指针保存的地址值,赋值给任意类型的指针变量

但是要注意:万能指针,同样不能做取值的操作,因为不知道取多少字节的数据

四:空指针和野指针

野指针:指向不明确,或者是说指向的内存是否有权限访问不明确,这样的指针称之为野指针,如果对一个野指针进行取值等操作,出错也正常,不出错也正常

空指针:指针定义出来后赋值为NULL,则说该指针为空指针

NULL是一个宏,该宏被define为(void *)0x0

在linux中规定0号内存默认不分配给任意进程使用,是一块不可读也不可写的内存,如果你不小心操作了该指针,绝对会出错(段错误)

所以建议:当定义一个指针时,此时不知道指针要赋什么值的时候,建议初始化为NULL(int *p=NULL;)

五:指针的运算

*:取值运算

&:取地址运算

++:指针进行++操作,并不是在其地址值上+1,而是做地址偏移

至于地址要偏移多少,取决于指针的数据类型,如果是int类型的指针,偏移4个字节,如果是char型,偏移1个字节

六:多级指针

多级指针:

一级指针可以指向变量的内存,二级指针记录一级指针的地址,三级记录二级地址,以此类推

二级指针有权利去读取一级指针的值,或修改一级指针的指向

七:const修饰的指针(指针常量与常量指针)

常量与指针:

常量指针:是一个指针,指针指向一块"常量"空间,指针指向(值)可以发生更改,但指针指向空间的值不允许修改

语法:const 数据类型*指针名称 or 数据类型 const *指针名称

例如:const int *p or int const *p;

指针常量:是一个常量,指针的指向(值)不可以发生更改,但指针指向空间的值允许修改

语法:数据类型 *const 常量名称

例如:int *const p;

常量指针常量:是一个指针,但是一个常量指针,指针指向(值)不可以发生更改,指针指向空间的值也不允许修改

语法:const 数据类型 *const 指向名称;

例如:const int *const p;

如果函数需要一个常量指针,实际是间接在提示调用者,该参数你可以放心传参,因为使用的指针没有权限去修改你内存的值

八:指针的用法与图解

责任编辑:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值