C语言学习笔记----4(指针)

本文深入介绍了C语言中的指针,包括二级指针、字符指针、指针数组、数组指针、函数指针以及回调函数的概念和用法。通过实例解析了指针在内存中的存储方式,以及如何通过指针操作数据。同时,讨论了函数指针数组和回调函数在实际编程中的应用,展示了指针在C语言中的核心地位。
摘要由CSDN通过智能技术生成

指针深入介绍

众所周知,亚里士多德1撑起了古希腊科学、哲学的半壁江山。

而指针就像是C语言中的亚里士多德一样,撑起了C语言的半壁江山。
ALT
不,与其说,指针撑起了C语言的半壁江山,不如说是指针创造了C语言的一片天地。请添加图片描述

小明:指针不就是存放了一个地址的变量而已嘛?就这?

小明,数学题你都会做了?还是你终于考上大学了?来这凑啥热闹?

请添加图片描述

指针类型

首先,要登场的是我们的二级指针
请添加图片描述

二级指针

小明同学在不经意间,已经说出了一个惊天大秘密!!!

指针就是一个变量
只不过是说 指针 这个变量和其他的变量不同,它存放的是某个数据的位置

变量,就意味着指针也是存放在内存中的某个位置,它也有自己的“门牌号”
也就是只要我有钥匙,我就可以光明正大进入指针的小家

请添加图片描述
em…当然最关键的还是需要 “&” 老大哥来帮忙配个钥匙
ALT

int main()
{
   
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	//此时ppa变量中存放的内容就是pa指针的地址
	return 0;
}

此时,我们就通过ppa可以进入pa的小家,“光明正大”地实施改造计划。

请添加图片描述

首先,趁着 pa 出门打酱油,将 a 进行改变

int main()
{
   
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	**ppa = 100;
	return 0;
}

在这里插入图片描述

小明:就这???

那来个狠的

int main()
{
   
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	**ppa = 100;
	int b = 20;
	*ppa = &b;
	return 0;
}

在这里插入图片描述

新创建一个 b 变量,进行操作 **ppa = &b;
此时再使用 pa 得到的就不是 a 变量,而是 b 变量

指针pa:我媳妇呢???

通过观察,可以知道 二级指针的结构int* *p
其中 int* 表示 p 的数据类型是 int* 类型的
剩下的 **“ * ”**则表示 p 是一个指针
合起来就是一个 指向一个int*类型的变量的指针

可以通过观察二级指针的结构,推导出三级指针,四级指针…

总结

  1. 二级指针存放的是一级指针的地址,而一级指针存放的是数据的地址
  2. 二级指针可以通过两次解引用操作来访问数据
  3. 二级指针进行一次解引用操作就可以改变一级指针存放的内容

小明:感觉也就一般般吧

请添加图片描述

字符指针

小明(不屑):字符指针?

eg

char ch = 'w';
char* pc = &ch;
printf("%c\n", ch);
printf("%c\n", *pc);

在这里插入图片描述

小明(不屑地准备滑走)

eg

char* str1 = "Hello World";
char* str2 = "Hello World";
char strArr1[] = "Hello World";
char strArr2[] = "Hello World";

问:
1、此时 str1str2 相等吗?

答:相等在这里插入图片描述

2、此时 strArr1strArr2 相等吗?

答:不相等
在这里插入图片描述

小明:为什么 str1str2 相等,而 strArr1strArr2 不相等呢?

"Hello World"是一个字符串常量2,将字符串常量赋值给字符指针的时候是将字符串常量的首元素的地址传给了字符指针,因此 str1str2 指向的都是 字符串常量的首元素的地址

strArr1strArr2 是数组,将字符串赋值给字符数组,相当于将字符一个一个复制到了数组中。

小明:那为啥他俩不还是一模一样?为啥电脑告诉我他们不相等?电脑骗人?

注意,计算机是不会骗人的,他们只是严格的执行一条接一条的指令而已。
之所以 strArr1strArr2 不相等是因为他们确实不相等。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值