关于指针

有关于指针的概念

1. 什么是指针
指针是一种数据类型(代表内存的地址的整数),使用它定义的变量叫指针变量。
2. 为什么使用指针,什么情况下使用指针
1)函数之间无法通过传参共享变量。
2)使用指针可以优化函数之间传参的效率。
3)堆内存无法与标识符建立联系,只能配合指针使用。
3. 如何使用指针
定义:类型* 变量名p;
1)指针变量与普通变量使用方法有很大的区别,一般以p结尾,与普通变量区分开来。
2)表示此变量是一个指针变量,一个只能定义出一个指针变量,不能连续定义。
3)类型表示的是存储什么类型变量的地址,它决定当通过地址访问这块内存时访问的字节数。
4)指针变量的默认值也是不确定的,一般初始化为NULL(空指针)。
4.解引用
1)根据变量中存储的内存编号去访问内存的数据,访问多少个字节要根据指针变量的类型。
2)如果指针变量存储的地址出错,此时可能发生段错误。
5. 使用指针要注意的问题
1)空指针
指针变量的值为NULL,这种指针变量叫空指针,空指针不能进行解引用。
空指针还被当作错误标志,如果一个函数的返回值是指针类型,实际返回的值是NULL,则说明函数执行失败或出错。
2)野指针
指针变量的值是不确定的或都是无效的,这种指针叫做野指针。
使用野指针不一定会出现问题,可能产生的效果如下:
a.一切正常
b.段错误
c.脏数据
虽然使用野指针不一定会出错,但野指针比空指针的危险更大,因为野指针无法判断出来,也无法测试出来,也就意味着一旦产生无法杜绝。
虽然野指针无法判断也无法测试出来,但是所有的野指针都是人为制造出来的,最好方法就是不生产野指针:
a.定义指针变量时要初始化。
b.不返回局部变量的地址。
c.资源释放后,指向它的指针及时置空。
5. 指针和数组的关系
数组名就是个指针(常指针),数组名与数组首地址是映射关系,而指针是指向关系。
由于数组名就是指针,所以数组名可以使用指针的解引用运算符,而指针也可以使用数组的[]运算符。
使用数组当函数的参数时,数组会蜕变成指针,长度也就丢失,因此需要额外添加一个参数用来传递数组的长度。
6. 指针的运算
指针的本质就是个整数,因此从语法上来说整数能使用的运算符它都能使用。
不是所有的运算符对指针运算都是有意义的。
指针+整数 <=> 指针+宽度 整数 向右移动
指针-整数 <=> 指针-宽度 整数 向左移动
指针-指针 <=> 指针-指针/宽度 计算出两个指针之间相隔多少个元素。
7. 指针和const配合
const int* p; 保护指针指向的数据,不能通过指针解引用修改内存的值。*
int const *p; 同上
int * const p; 保护指针变量,指针变量初始化之后不能再显式的赋值。
const int *const p; 既不能修改指针的值,也不能修改内存的值。
int const * const p; 同上。
8. 什么是二级指针,什么情况下使用
二级指针即指向一级指针地址的指针,当需要变量指向一级指针时,使用二级指针。
9. 函数指针
函数与数据项相似,函数也有地址。我们希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。
10. 数组指针
在C语言中,数组与其它变量在使用上有很大的不同.无论是字符型、整型、实型变量,还是结构体类型或者指针类型的变量,语句中出现变量名都代表对该变量所在内存单元的访问,变量名代表整个变量在内存中的存储单元,可以向该变量赋值,也可以从中取出数据使用.但是定义一个数组之后,数组名并不代表整个数组所占据的内存单元,而是代表数组首元素的地址.
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
11. 指针数组
定义 int p[n];
[ ]优先级高,先与p结合成为一个数组,再由int
说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
12. 结构体指针
结构体指针就是指向结构体变量的指针,如果一个指针变量中保存了结构体变量的首地址,那么这个指针变量就指向该结构体变量。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。
13. 结构体成员指针
即结构体中的一个成员变量是指针变量。
14. 指针和堆内存配合
即用malloc申请一块堆内存,并这个内存的首地址赋给一个指针变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值