【C语言】初学者了解 指针 及应用
温馨提示:这篇文章已超过384天没有更新,请注意相关的内容是否还可用!
1.初识指针
在C语言中,指针是一种非常重要且强大的概念,它可以让我们直接访问和操作内存中的数据。理解和运用指针是C语言编程中的重要一环,能够帮助我们更灵活地操作内存和数据,提高程序的效率和灵活性。
指针是一个变量,其值为内存地址,即指向另一个变量的地址。
1.1地址和内存
我们知道计算的CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那这些内存空间如何⾼效的管理呢?
其实内存会将自己划分为一个个的内存单元,每个内存单元的大小是1个字节。
1 byte = 8 bit
1 字节 = 8 比特位
1个比特位中可以存储1个2进制中的0或1
在计算机中,我们把内存单元的编号称为地址,
而在C语言中,地址有了一个新的名字:指针!
一般的,通过使用 * 符号来声明指针,例如
int *ptr;
表示声明了一个指向整数类型的指针。
1.2指针变量与取地址操作符 &
在C语言中,创建变量其实就是在向内存申请空间,例如上图中,a是一个整形int变量,那么它会向内存申请4个字节,每一个字节都对应着一个地址。
&运算符表示获取变量的地址,例如&a表示变量a的地址。
&a取出的是变量a所占的4个字节中地址较小的字节的地址。
1.3指针变量与解引用操作符 *
通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要
存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?
答案是:指针变量中。
int main()
{
int a = 10;
int* pa = &a;//将a的地址放进指针变量pa中
return 0;
}
指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。
这⾥pa左边写的是 int* , * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int)
类型的对象。
上⾯代码中就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间,
*pa其实就是a变量了;所以*pa=0,这个操作符是把a改成了0。
这⾥把a的修改通过指针交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活。
2.指针运算
指针可以进行加减运算,移动到相邻的内存位置。
指针也可以比较大小,判断两个指针是否指向同一块内存区域。
2.1指针 + - 整数
数组在内存中是连续存放的,因此我们只需要知道第一个元素的地址,就能找出所有的元素。
通过指针定位数组元素,让指针起始位置指向数组开头,通过*(p + i)的循环来使指针每次循环后移一位,实现打印数组。原理如下:
2.2指针 - 指针
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
int main()
{
printf("%d\n", my_strlen("abcdefg"));
return 0;
}
这段代码的作用是模拟strlen函数计算字符串的长度,并输出结果。在 my_strlen 函数中,通过接收一个指向字符数组的指针作为参数,在循环中逐个移动指针直到遇到字符串结束符 \0,然后返回指针 p 减去初始指针 s 的值,即字符串的长度。
在 main 函数中,调用 my_strlen 函数并将字符串常量 "abcdefg" 作为参数传递给该函数,最终打印出字符串的长度。因为字符串 "abcdefg" 的长度是7,所以程序输出的结果应该是 7。
3.野指针
野指针是程序设计中的一个术语,是指向不确定的内存地址的指针。这种情况通常发生在指针变量没有被初始化时。使用野指针可能会导致不可预测的行为,包括程序崩溃、数据损坏等严重问题。因此,在编程时需要特别注意避免野指针的出现。
3.1野指针的成因
3.1.1指针未初始化
#include
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
可以看到:使用了未初始化的局部变量"p",此时指针变量中存储的地址是随机的,可以指向任何位置。环境报错。
3.1.2指针越界访问
int main()
{
int arr[10] = { 0 };
int* p = &arr[0];
int i = 0;
for (i = 0; i 







