【C语言】初学者了解 指针 及应用

2024-03-05 1703阅读

温馨提示:这篇文章已超过384天没有更新,请注意相关的内容是否还可用!

1.初识指针

在C语言中,指针是一种非常重要且强大的概念,它可以让我们直接访问和操作内存中的数据。理解和运用指针是C语言编程中的重要一环,能够帮助我们更灵活地操作内存和数据,提高程序的效率和灵活性。

指针是一个变量,其值为内存地址,即指向另一个变量的地址。

【C语言】初学者了解 指针 及应用

1.1地址和内存

我们知道计算的CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那这些内存空间如何⾼效的管理呢?

其实内存会将自己划分为一个个的内存单元,每个内存单元的大小是1个字节。

1 byte = 8 bit

1 字节 = 8 比特位

1个比特位中可以存储1个2进制中的0或1

 在计算机中,我们把内存单元的编号称为地址,

而在C语言中,地址有了一个新的名字:指针!

【C语言】初学者了解 指针 及应用

一般的,通过使用 * 符号来声明指针,例如

 int *ptr; 

表示声明了一个指向整数类型的指针。

1.2指针变量与取地址操作符 &

【C语言】初学者了解 指针 及应用

在C语言中,创建变量其实就是在向内存申请空间,例如上图中,a是一个整形int变量,那么它会向内存申请4个字节,每一个字节都对应着一个地址。

【C语言】初学者了解 指针 及应用

&运算符表示获取变量的地址,例如&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)

类型的对象。

【C语言】初学者了解 指针 及应用

上⾯代码中就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间,

*pa其实就是a变量了;所以*pa=0,这个操作符是把a改成了0。

这⾥把a的修改通过指针交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活。

2.指针运算

指针可以进行加减运算,移动到相邻的内存位置。

指针也可以比较大小,判断两个指针是否指向同一块内存区域。

2.1指针 + - 整数 

数组在内存中是连续存放的,因此我们只需要知道第一个元素的地址,就能找出所有的元素。

【C语言】初学者了解 指针 及应用

 通过指针定位数组元素,让指针起始位置指向数组开头,通过*(p + i)的循环来使指针每次循环后移一位,实现打印数组。原理如下:

【C语言】初学者了解 指针 及应用

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",此时指针变量中存储的地址是随机的,可以指向任何位置。环境报错。

【C语言】初学者了解 指针 及应用

3.1.2指针越界访问

int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]