c语言初学指针

目录

初学指针

一.引言

二.初等指针:内存地址

三.指针类型的意义

1.指针解引用权限​

2.指针移动步长​

三.C 语言指针的运算

1.指针加减整数​

2.指针减指针​

四.野指针

1.指针未初始化​

2.越界访问​

3.指针指向的空间被释放​

4.为了避免野指针我们可以采取以下措施:​

1.指针初始化:

2.小心指针越界:

3.指针指向的空间释放及时置NULL:

​4.指针使用之前检查有效性:

五.二级指针(多级)

六.总结


初学指针

一.引言

在 C 语言的世界里,指针堪称一项极为重要却又颇具挑战性的特性。它赋予了程序员对内存强大的操控能力,同时也是许多高效算法与复杂数据结构实现的关键。理解指针的概念、运作机制及其相关操作,对于编写优质、高效的 C 语言代码至关重要。接下来,让我们一同深入探索 C 语言指针的奥秘。​

二.初等指针:内存地址

指针,本质上就是一块内存地址。在 C 语言中,我们可以使用%p格式说明符来打印一块内存地址。指针变量在不同的平台下所占的内存空间有所不同,在 32 位平台下,它占据 4 个字节,而在 64 位平台下则扩展为 8 个字节。值得一提的是,数组名在 C 语言中代表着数组首元素的地址,这为通过指针操作数组元素提供了便利。例如:​

int arr[5] = {1, 2, 3, 4, 5};​

int *p = arr; // 这里arr即为数组首元素地址,赋值给指针p​

三.指针类型的意义

1.指针解引用权限​

指针类型决定了指针解引用时的权限大小。以字符指针char *pc为例,它每次解引用只能访问 1 个字节的数据,而整形指针int *pi解引用时则可以操作 4 个字节的数据(假设在常见的 32 位系统下,int类型占 4 个字节)。这是因为不同的数据类型在内存中所占的空间大小不同,指针类型需要与所指向数据的类型相匹配,以确保正确地访问和操作数据。

2.指针移动步长​

指针类型还决定了指针在进行移动操作时,每走一步所跨越的字节数。对于整形指针,当它执行加 1 操作时,其实际地址会增加 4 个字节,这与int类型在内存中所占的字节数一致。同理,字符指针加 1 时,地址仅增加 1 个字节。

三.C 语言指针的运算

1.指针加减整数​

指针与整数的加减法运算是指针操作中常见的运算方式。指针类型决定了指针每加一或减一时,地址所增加或减少的字节数。例如,在一个整形数组中,要访问数组中相隔几个元素的数值,可以通过指针加上相应的整数偏移量来实现。如下代码展示了如何使用指针加法访问数组元素:​

int arr[5] = {1, 2, 3, 4, 5};​

int *p = arr;​

int value = *(p + 2); // value获取arr[2]的值,即3​

2.指针减指针​

指针减指针运算的结果表示两个指针之间所包含的元素个数(前提是这两个指针指向同一数组)。利用这一特性,我们可以实现一些实用的功能,比如计算字符串的长度。下面是一个通过指针减指针来计算字符串长度的自定义函数示例:​

int my_strlen(char *arr) {​

char *str = arr;​

while (*arr != '\0') {​

arr++;​

}​

return arr - str;​

}​

在上述代码中,arr指针从字符串起始位置开始,不断向后移动,直到遇到字符串结束符'\0'。通过计算移动后的arr指针与起始str指针的差值,即可得到字符串的长度。​

四.野指针

野指针是指那些指向位置不确定的指针,随时可能引发的错误。野指针的成因主要有以下几种:​

1.指针未初始化​

当定义一个指针变量时,如果没有为其赋予一个明确的初始值,它将指向一个不确定的内存位置,从而成为野指针。例如:​

int *p; // p未初始化,成为野指针​

2.越界访问​

在对数组或其他内存区域进行访问时,如果指针超出了其合法的范围,就会导致越界访问,进而产生野指针问题。例如:​

int arr[5] = {1, 2, 3, 4, 5};​

int *p = arr;​

for (int i = 0; i <= 7; i++) {​

printf("%d ", *(p + i)); // 当i为5时,p越界访问,可能导致野指针问题​

}​

3.指针指向的空间被释放​

当动态分配的内存空间被释放后,如果仍然使用指向该空间的指针,那么这个指针就变成了野指针。

4.为了避免野指针我们可以采取以下措施:​

1.指针初始化:

在定义指针变量时,若暂时不清楚其应指向何处,可以将其初始化为NULL。例如:int *p = NULL;​

2.小心指针越界:

在对数组或内存区域进行操作时,务必仔细检查指针的移动范围,确保其始终在合法的界限内。​

3.指针指向的空间释放及时置NULL:
​4.指针使用之前检查有效性:

在解引用指针之前,先检查其是否为NULL,以确保指针指向的是有效的内存地址。例如:​

int *p = NULL;​

if (p != NULL) {​

*p = 20;​

}​

​

五.二级指针(多级)

在 C 语言中,除了一级指针,还存在二级指针以及更高级别的指针。以一个简单的示例来说明,假设有一个整形变量a:​

int a = 10;​

int *p = &a; // p是一级指针,指向变量a的地址​

int **pa = &p; // pa是二级指针,指向一级指针p的地址​

​

在上述代码中,pa就是一个二级指针。通过二级指针,我们可以间接地访问和操作一级指针所指向的变量。具体关系如下:​

*pa:对二级指针pa进行一次解引用,得到的是一级指针p,即*pa == p。​

*p:对一级指针p进行解引用,得到的是变量a,即*p == a。​

**pa:对二级指针pa进行两次解引用,同样可以得到变量a,即**pa == a。

需要注意的是

可以获取数组最后一个元素后一个的地址,

但绝不能找数组前一个元素前一个的地址

六.总结

综上所述,指针作为 C 语言的核心特性之一,为程序员提供了对内存的精细控制能力。深入理解指针的概念、类型、运算以及野指针的防范,熟练掌握二级指针等应用,将极大地提升我们编写高效、可靠 C 语言代码的能力。在实际编程过程中,务必谨慎操作指针,充分发挥其强大功能的同时,避免因指针使用不当而引入的各种问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值