C语言笔记归纳12:指针(3)

C语言:指针 1、一个变量的地址称为该变量的“指针”。**指针是一个地址,而指针变量是存放地址的变量。**指针变量只能存放地址。 2、定义指针变量:类型名 *指针变量名; int *pointer_1; 一个变量的指针的含义包括两个方面,一是以存储单元编号表示的地址,二是它指向的存储单元的数据类型。 3、引用指针变量: 4、通过指针引用数组 5、指向函数的指针 6、返回指针值的函数:类型名 * 函数名(参数表... 阅读详情

指针(3)

目录

指针(3)

1. 📝 字符指针:常量字符串的 “只读陷阱” 与存储秘密

1.1 字符指针 vs 字符数组:可变 vs 只读

1.2 为什么str1≠str2但str3=str4?

2. 📚 数组指针:指向数组的 “专属导航仪”

2.1 数组指针 vs 指针数组:别再搞混双胞胎!

2.2 数组指针的 “步长”:一跳就是整个数组

3. 🧩 二维数组传参:数组指针的实战舞台

3.1 二维数组的地址逻辑:行地址≠元素地址

3.2 传参的两种写法:数组形式 vs 指针形式

4. 🔧 函数指针:存储函数地址的 “特殊名片”

4.1 函数地址的获取:函数名 =(& 函数名)

4.2 函数指针的调用:*可省可加

4.3 两段 “天书代码” 的拆解

代码 1:(*(void(*)())0)();

代码 2:void (*signal(int, void(*)(int)))(int);

4.4 typedefvs#define:类型重命名的坑

5. 🗂️ 函数指针数组:打造函数的 “工具箱”

6. ⚙️ 转移表:函数指针数组的经典实战(计算器案例)

传统 switch 实现(冗余)

转移表实现(简洁高效)

7. 🔄 回调函数:指针驱动的 “灵活响应机制”

定义与示例

实际应用:

🎉 总结:指针进阶的核心逻辑


✨ 引言:

指针是 C 语言的 “灵魂进阶篇”🤯—— 字符指针、数组指针、函数指针、回调函数…… 这些概念层层递进,新手容易绕晕,但一旦吃透,代码效率和灵活性会翻倍!

1. 📝 字符指针:常量字符串的 “只读陷阱” 与存储秘密

字符指针不仅能指向单个字符,还能指向字符串 —— 但这里藏着新手最容易踩的 “只读坑”,还有存储的小秘密!

1.1 字符指针 vs 字符数组:可变 vs 只读

字符数组是 “可修改的草稿纸”,常量字符串是 “贴了只读标签的打印件”:

int main()
{
	char ch = 'w';
	char* pc = &ch;//指向单个字符的指针

	char arr[10] = "abcdef";//字符数组(栈区,内容可修改)
	//内存布局:a b c d e f \0 0 0 0(像可擦写的草稿纸)
	char* p1 = arr;
	*p1 = 'w';//合法:修改数组内容(擦改草稿纸)

	const char* p2 = "abcdef";//指向常量字符串(代码段,只读)
	//*p2 = 'w'//err:修改只读内存会崩溃!(试图改打印件)
	printf("%s\n", p1);//wbcdef
	printf("%s\n", p2);//abcdef
	return 0;
}

📌 核心区别(必记!):

类型存储区域内容是否可修改
字符数组栈区是
常量字符串代码段否(const是提醒,不加也报错)

1.2 为什么str1≠str2但str3=str4?

就像 “两个独立小区 vs 共享一个公共设施”:

int main()
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";

	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";

	if (str1 == str2) printf("str1和str2相同\n");//❌ 输出不同
	else printf("str1和str2不同\n");//✅

	if (str3 == str4) printf("str3和str4相同\n");//✅
	else printf("str3和str4不同\n");//❌
	return 0;
}

🤔 通俗解释:

  • str1和str2是栈区的两个独立数组(两个小区),各占一块内存,首地址自然不同;
  • str3和str4指向代码段的同一个常量字符串(共享一个公园)—— 系统为了节省空间,相同的常量字符串只存储一份,所以地址相同。

💡 小贴士:%s打印字符串时,只需传入起始地址,会自动打印到\0结束,不用手动循环!

2. 📚 数组指针:指向数组的 “专属导航仪”

数组指针不是 “指针数组”!它是专门指向整个数组的指针—— 就像导航仪专门定位 “整个小区”,而不是单个 “住户”。

2.1 数组指针 vs 指针数组:别再搞混双胞胎!

int main()
{
	int arr[10] = { 0 };
	int(*p)[10] = &arr;//p是数组指针:指向包含10个int的数组
	//int* p1[10];//p1是指针数组:数组里存的是10个int*指针
	return 0;
}

⚠️ 优先级陷阱(关键!):

  • int(*p)[10]:()优先级高,p先和*结合,是指针,指向 “10 个 int 的数组”;
  • int* p1[10]:[]优先级高,p1先和[]结合,是数组,存的是 “int * 指针”。

2.2 数组指针的 “步长”:一跳就是整个数组

普通指针跳 “一个元素”,数组指针跳 “整个数组”:

int main()
{
	int arr[10] = { 0 };
	int* p1 = arr;//int*:指向首元素(住户导航)
	int(*p2)[10] = &arr;//int(*)[10]:指向整个数组(小区导航)

	printf("%p\n", p1);//000000983ED3FA28
	printf("%p\n", p1 + 1);//000000983ED3FA2C(+4字节:1个int,到下一户)

	printf("%p\n", p2);//000000983ED3FA28
	printf("%p\n", p2 + 1);//000000983ED3FA50(+40字节:10个int,到下一个小区)
	return 0;
}

📌 结论:数组指针的 “步长”= 指向数组的总大小(sizeof(数组))。

3. 🧩 二维数组传参:数组指针的实战舞台

二维数组传参的本质是 “传递行地址”—— 而行地址就是数组指针!

3.1 二维数组的地址逻辑:行地址≠元素地址

二维数组可以看作 “数组的数组”,首元素是 “第一行的一维数组”:

int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
// arr:二维数组名 → 第一行的地址(int(*)[5],数组指针)
// arr+i:第i行的地址(int(*)[5])
// *(arr+i) = arr[i] → 第i行的数组名 → 第i行首元素地址(int*)
// *(arr+i)+j → 第i行第j列元素地址(int*)
// *(*(arr+i)+j) = arr[i][j] → 第i行第j列元素(int)

🤔 比喻:二维数组是 “3 栋楼,每栋 5 户”:

  • arr是 1 号楼的地址(数组指针);
  • arr+1是 2 号楼的地址;
  • *(arr+1)是 2 号楼 1 单元的地址(普通指针);
  • *(arr+1)+2是 2 号楼 3 单元的地址;
  • *(*(arr+1)+2)是 2 号楼 3 单元的住户(元素值)。

3.2 传参的两种写法:数组形式 vs 指针形式

二维数组传参时,列数不能省略(因为要知道 “每栋楼有几户”):

// 写法1:数组形式(直观,本质是数组指针)
// void print(int arr[3][5], int r, int c)
// {
// 	// ...
// }

// 写法2:数组指针形式(更贴近本质)
void print(int(*arr)[5], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", *(*(arr + i) + j));//等价于arr[i][j]
		}
		printf("\n");
	}
}

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	print(arr, 3, 5);
	// 输出:
	// 1 2 3 4 5 
	// 2 3 4 5 6
	// 3 4 5 6 7
	return 0;
}

📌 关键:二维数组名arr的类型是int(*)[5](数组指针),所以形参必须用相同类型接收!

4. 🔧 函数指针:存储函数地址的 “特殊名片”

函数也有地址!函数指针就是存放函数地址的变量 —— 就像用名片存着 “公司地址”,拿着名片就能找到公司(调用函数)。

4.1 函数地址的获取:函数名 =(& 函数名)

和数组名不同,函数名和&函数名完全等价,都表示函数的入口地址:

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	printf("%p\n", &Add);//00DF10B9(函数地址)
	printf("%p\n", Add);//00DF10B9(和&Add完全相同)

	// 函数指针定义:返回值类型 (*变量名)(参数类型1, 参数类型2)
	int(*pf)(int,int) = &Add;//pf是函数指针变量
	return 0;
}

📌 函数指针类型格式:返回值类型 (*变量名)(参数类型列表)。

4.2 函数指针的调用:*可省可加

调用函数指针时,*只是 “仪式感”,加不加都能调用:

int main()
{
	int(*pf)(int, int) = Add;
	int c = Add(2, 3);//直接调用(常用)
	int d = (*pf)(3, 4);//解引用调用(*可省)
	int e = pf(4, 5);//函数指针直接调用(更简洁)
	printf("%d\n", c);//5
	printf("%d\n", d);//7
	printf("%d\n", e);//9
	return 0;
}

💡 小贴士:函数指针的核心是 “通过地址调用函数”,*的作用是 “解引用地址”,但编译器会自动识别,所以可省略。

4.3 两段 “天书代码” 的拆解

代码 1:(*(void(*)())0)();
int main()
{
	(*(void(*)())0)();
	// 拆解(从内到外):
	// 1. void(*)() → 无参数、返回值为void的函数指针类型(“函数类型模板”)
	// 2. (void(*)())0 → 把0强制转换成该函数指针类型(假设0地址有个这样的函数)
	// 3. *(void(*)())0 → 解引用0地址的函数指针(找到这个函数)
	// 4. (*...)() → 调用这个函数(无参数)
	return 0;
}
代码 2:void (*signal(int, void(*)(int)))(int);

这是标准库signal函数的声明,返回值是 “函数指针”,用typedef简化后更清晰:

// typedef简化函数指针类型
typedef void(*pf_t)(int);//pf_t = void(*)(int)(给函数指针类型起别名)
pf_t signal(int, pf_t);//简化后:返回pf_t,参数是int+pf_t

4.4 typedefvs#define:类型重命名的坑

typedef是 “真正的类型重命名”,#define只是 “文本替换”,别踩坑!

typedef int* ptr_t;
#define PTR_T int*

ptr_t p1, p2;//p1、p2都是int*(typedef是类型重命名,统一类型)
PTR_T p3, p4;//p3是int*,p4是int(#define文本替换:int* p3,p4)

📌 区别:typedef会把整个别名当作一个类型,#define只做简单替换,*只会绑定第一个变量。

5. 🗂️ 函数指针数组:打造函数的 “工具箱”

函数指针数组是 “存放多个函数指针的数组”—— 把功能相似的函数(如加减乘除)的地址 “打包”,像工具箱一样按需取用!

int Add(int x, int y) { return x+y; }
int Sub(int x, int y) { return x-y; }
int Mul(int x, int y) { return x*y; }
int Div(int x, int y) { return x/y; }

int main()
{
	// 函数指针数组定义:int(*数组名[元素个数])(参数类型)
	int(*pfarr[4])(int, int) = { Add, Sub, Mul, Div };
	
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int r = pfarr[i](8, 4);//通过下标调用对应函数(工具箱取工具)
		printf("%d\n", r);//12 4 32 2
	}
	return 0;
}

✨ 优势:批量管理函数,避免重复的switch/if判断,代码更简洁!

6. ⚙️ 转移表:函数指针数组的经典实战(计算器案例)

计算器的加减乘除功能,用函数指针数组(转移表)实现,代码更简洁、扩展性更强!

传统 switch 实现(冗余)

// 原代码:重复的输入、计算逻辑
switch (input)
{
case 1:
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	z = Add(x, y);
	printf("%d\n", z);
	break;
case 2:
	// 重复输入、计算逻辑(Sub)
	break;
// ...(case3/4重复类似代码)
}

转移表实现(简洁高效)

void menu()
{
	printf("*********************************\n");
	printf("*******  1.add   2.sub  *********\n");
	printf("*******  3.mul   4.div  *********\n");
	printf("*******  0.exit         *********\n");
	printf("*********************************\n");
}

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int z = 0;
	// 函数指针数组(转移表):下标对应功能选项
	int(*pfArr[5])(int,int) = { 0 , Add , Sub , Mul , Div};
	//                          0     1    2     3     4        

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if(input >= 1 && input <= 4)
		{
		  printf("请输入两个操作数:");
		  scanf("%d %d", &x, &y);
		  z = pfArr[input](x,y);//通过下标调用对应函数
		  printf("%d\n", z);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}

	} while (input);

	return 0;
}

📌 优势:新增功能(如取模)只需添加函数和更新数组,不用修改switch结构,扩展性拉满!

7. 🔄 回调函数:指针驱动的 “灵活响应机制”

回调函数是 “通过函数指针调用的函数”—— 把函数作为参数传递给另一个函数,在需要时触发调用,像 “按需响应的开关”!

定义与示例

// 回调函数:具体的功能实现(Add/Sub等)
int Add(int x, int y)
{
	return x + y;
}

// 主调函数:接收函数指针参数,统一处理逻辑
void calc(int(*pf)(int,int))
{ 
	int x = 0;
	int y = 0;
	int z = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	z = pf(x, y);//调用回调函数(触发功能)
	printf("%d\n", z);
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);//把Add作为参数传给calc,calc中回调Add
			break;
		case 2:
			calc(Sub);//回调Sub
			break;
		// ...(case3/4类似)
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);

	return 0;
}

💡 核心特点:

  • 回调函数不由自己直接调用,而是由主调函数(如calc)在特定条件下触发;
  • 主调函数统一处理公共逻辑(如输入输出),回调函数处理具体功能,实现 “公共逻辑复用 + 功能灵活切换”。

实际应用:

qsort(快速排序函数)就是典型的回调函数应用 ——qsort负责排序框架,用户通过回调函数定义排序规则(升序 / 降序、结构体字段排序等)。

🎉 总结:指针进阶的核心逻辑

  1. 字符指针指向常量字符串时,牢记 “只读属性”,避免修改崩溃;
  2. 数组指针指向整个数组,步长 = 数组总大小,二维数组传参本质是传 “行地址”;
  3. 函数指针是函数的 “地址名片”,typedef能简化复杂声明;
  4. 函数指针数组(转移表)是批量管理函数的利器,提升代码扩展性;
  5. 回调函数通过函数指针实现 “灵活响应”,是模块化编程的关键。

指针进阶的本质是 “用地址管理一切”—— 字符、数组、函数都能通过地址灵活操作,掌握这些知识点,你就能写出更高效、更灵活的 C 语言代码!如果这篇博客帮你理清了思路,欢迎点赞收藏🌟~ 

【信号与系统】Multisim 仿真信号合成与分解 软件 Multisim 进行方波信号的产生、分解和合成,观察信号波形的分解与合成,加深对信号频谱的理解。 阅读详情

相关推荐

【STM32】R05D电控红外协议的美的空调遥控器

目录一、设计思路一、R05D红外协议原理1.协议手册理解2.验证时序(重点)二、硬件实现1.需要的材料2.对发射模块电路进行修改3.STM32 GPIO选择三、代码实现1.载波38kHZ实现2.R05D时序实现3.调用函数并验证 一、设计思路 通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 R05D电控功

weixin_42204837的博客 1万+

C语言——指针

C语言——指针

weixin_59796310的博客 11万+

汇川PLC和PLC之间ModebusTCP通讯

然后在全局变量中创建相应的变量关联IW和QW的寄存器创建全部变量//AM402作为主站——读H3U(D12-D21)//AM402作为主站——写给H3U(D200-D209)或者使用数组的方式。

panjinliang066333的博客 3万+

C语言指针全归纳-初级版

C语言作为一门较为好上手的高级计算机语言,我相信任何一个开始学习编程的人都是先从他开始入手的,但是其中的指针曾叫人叫苦不迭。本文章旨在全面梳理C语言指针的知识点,内容非常宏大且精细,希望可以给看到本篇文章的人带来全新的指针认识。 本文章主要内容1. 什么是指针2. 指针的类型有哪些3. 野指针4. 指针的运算5. 指针和数组6. 二级指针7. 指针数组 1. 什么是指针 先来看看定义 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器

weixin_53451597的博客 5129

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6636

dpdk 源码分析 rte_ring

rte_ring源码分析

qq_40843445的博客 930

C语言指针全归纳-进阶版

大家好,上次的初阶版让我第一次尝到了写博客的甜头,原来可以有这么多人看我的博客呀,非常感谢大家对我的支持与鼓励,我一定会再接再厉,继续创作出优质的内容来向大家分享知识。 进阶的内容比较庞大,所以我会分为多篇博客进行上传,请大家敬请期待,当然如果我有错误的地方希望大家可以指正我的错误,万分感谢 防止有些博友没有看过前一篇我的博客,在此简单概括一下那篇博客的内容有哪些。 指针变量是用来存放地址的,对其解引用就可以找到该地址唯一标识的内存空间 指针大小在32位平台上为4字节,在64位平台上为8字节 指针具有类型

weixin_53451597的博客 3867

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1166

C语言程序设计错题归纳

C语言程序设计错题归纳 1.在C语言中能逐个地使用下标变量,也能一次引用整个数组。(F) 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。(F) 3.一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。类型名 数组名[数组长度];(F) 4.不正确的赋值或赋初值的方式是__C__。 A.char str[]=“string”; B.char str[7]={‘s’...

wumingshi12345的博客 9624

Python爬虫实战:构建药监局药品批准信息本地查询系统

在医药信息化时代,药品批准信息的快速查询对于医药从业者、研究人员和普通消费者都具有重要意义。国家药品监督管理局(NMPA)提供了官方的药品查询系统,但有时我们需要建立本地数据库以便批量分析或离线查询。本文将详细介绍如何使用Python爬虫技术,结合最新的异步爬虫框架和技术栈,构建一个完整的药监局药品信息本地查询系统。本系统将实现以下功能:自动化爬取药监局官网的药品批准信息数据清洗和结构化存储建立本地查询接口数据定期更新机制pythonimport os"""药品类型枚举"""

2201_76125261的博客 729

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图)

1万+

C语言指针知识点小结

前期回顾   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过指针引用数组   C语言指针基础知识点(五)–用数组名作函数参数   C语言指针基础知识点(六)–通过指针引用多维数组   C语言指针基础知识点(七)–通过指针引用字符串   C语言指针基础知识点(八...

zhf的博客 1万+

STM32芯片解锁读写保护:更改Option Byte [Error已解决]

解锁读保护:STLink更改Option Byte 变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1) 默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。 RDP读保护级别 级别0,无保护, 级别1,使能读保护, 这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止); 当芯片处于级别1的时候,可以把选项字节

HowieXue 薛永浩的博客 2万+

【c语言】指针--学习笔记

如图所示,数据的储存需要一份内存空间,而为了便于我们使用数据,每个内存空间都有一串编号,即为他的地址,也就是指针。内存单元的编号==地址==指针。

每一行代码都会有改变世界的力量~ 1677

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言笔记归纳10:指针(1)

类型* 变量名int main()int a = 10;// p是指针变量(本质是变量),存放a的地址;int*表示p指向的是int类型变量return 0;的作用:仅用于说明 “这个变量是指针类型”,和变量值无关;指针变量的命名:通常加p前缀(如pcpa),方便区分普通变量。指针的本质是地址,指针变量是存放地址的容器—— 掌握指针的关键,是理解 “类型决定操作规则”“地址操作直接操作内存”。指针虽难,但只要多敲代码、多画图分析,就能从 “害怕” 到 “熟练”!

yonakaame的博客 1098

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言笔记归纳14:指针(5)

指针的内存大小仅与平台有关(32 位 4 字节,64 位 8 字节),与指针类型(int*、char*、数组指针)无关;sizeof(指针)是指针本身大小,sizeof(*指针)是指向内容的大小。sizeof:编译期操作符,量内存大小,不执行表达式,数组名单独放里面算整个数组大小;strlen:运行期函数,数\0前字符数,必须传地址,无\0随机值,传非地址崩溃;数组名:默认是首元素地址,sizeof(数组名)和&数组名代表整个数组;指针运算指针 ± 整数:步长 = 指针指向类型的大小;

yonakaame的博客 1180

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C语言笔记归纳11:指针(2)

/ 普通变量:值=10,地址=&a// 一级指针:值=&a,地址=&p// 二级指针:值=&p,地址=&pp// 三级指针(以此类推,很少用)return 0;// arr是指针数组,3个元素都是int*类型arr[0]arr1(指向第一个一维数组首元素);arr[1]arr2(指向第二个一维数组首元素);arr[2]arr3(指向第三个一维数组首元素)。数组名本质是首元素地址,仅sizeof(数组名)和&数组名例外;

yonakaame的博客 1236

C语言笔记归纳13:指针(4)

回调函数 = 由函数指针调用的函数(如calc里的add)主调函数 = 负责框架的函数(如calc)排序函数(主调)负责 “两两比较 + 交换” 的框架;比较函数(回调)负责 “怎么比”(整型比大小 / 字符串比 ASCII / 结构体比年龄)。void * 指针:万能地址接收器,适配任意数据类型(但要转成 char * 才能计算偏移);回调函数:把 “怎么比较” 的细节交给用户,实现框架通用;逐字节操作:用 char*+width 实现任意大小元素的交换(Swap 函数)。

yonakaame的博客 1328

C语言学习——指针归纳总结

本文系统介绍了C语言中指针的核心概念与应用。首先阐述了指针的本质是保存内存地址的特殊变量,详细讲解了指针的定义语法、内存访问方式及操作规则。其次深入分析了指针与地址的关系,通过变量交换案例展示了指针的实际应用。在指针与数组部分,揭示了数组名即首元素地址的特性,以及指针运算的注意事项。关于指针与函数,重点讲解了函数指针的定义和使用方法,如何通过函数指针实现多态调用。最后介绍了堆空间的动态内存管理机制,以及void指针的特点和使用限制。全文贯穿代码示例,完整呈现了指针这一C语言核心特性的知识体系。

2301_80366509的博客 886

C语言——指针(一)

指针入门讲解一,详细!详细!再详细!

tan_run的博客 2143

C语言归纳七-指针

目录 一、指针简介 二、定义指针变量 三、C语言数组指针详解 划重点: 自加优先级大于*优先级大于+优先级。 四、C语言字符数组和字符串常量指针详解 五、C语言字符串数组理解小检测 注意,数组初始化的时候,char str[20] = {0};是将数组初始化全部为'\0',int str[20]={0};是初始化全部为0。 用数组作为函数参数的话,实际上还是用数组指针作为函数参数...

chengxuya的博客 908

【C语言进阶】④指针归纳总结,这些指针你都认识吗?

文章目录一、指针的概念二、野指针1. 概念:2. 为什么会出现野指针?3. 如何避免野指针的出现?三、指针类型总结3.1字符指针3.2指针数组3.3数组指针3.4指针函数3.5函数指针3.6.看一段代码,想一想打印的结果是什么?3.7.输出的是两个地址,这两个地址是 test 函数的地址 为什么呢?3.8指针函数和函数指针总结四、感谢与预告 一、指针的概念 指针就是一个变量,只不过这个变量比较特别,是用来存放地址的,而地址是计算机内部唯一标识的一块内存空间,即:地址是存储空间的编号!;其实忽略这个变量

森林里的白杨 890

c语言指针归位,C语言指针全归纳-初级版

C语言作为一门较为好上手的高级计算机语言,我相信任何一个开始学习编程的人都是先从他开始入手的,但是其中的指针曾叫人叫苦不迭。本文章旨在全面梳理C语言指针的知识点,内容非常宏大且精细,希望可以给看到本篇文章的人带来全新的指针认识。本文为初阶版,我会尽快创作出高阶版的指针,喜欢本文的可以点个关注本文章主要内容1. 什么是指针先来看看定义在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用...

weixin_31741271的博客 796

知识点7.C语言指针的总结归纳 -

关于指针的总结归纳 1.指针的含义:指针即是地址 2.指针的定义: `变量类型 变量名 int a 函数类型 函数名 int a(); 数组类型 数组名 int a[]; 类比可得 指针类型 指针变量名 int * a; 指针赋值方法: 一,取地址符赋值 int a; int *p=&a...

超越想象 3689

【归纳】C语言基础知识回顾

    本章归纳C语言中疑难知识点,容易出错的用法及语法,特殊用法扩展等 目录 第一章  C语言概述 第二章  算法——程序的灵魂 第三章  数据的表现形式及其运算   3.1 数据类型及运算       3.1.1  常量和变量       3.1.2  数据类型       3.1.3  整型数据       3.1.4  字符型数据 &lt;1&gt;关于罕见字符的输出:...

荆楚长铗 1万+

C语言的指针

在编程中,指针与地址是同一个概念,因此可以先从地址的角度理解指针。编程中的地址可以说是对实际生活中地址的抽象,比如在收发快递时,快递员通过提供的地址,就可以准确的定位到你家的位置。对应到编程中,可以说操作系统对每字节的内存空间都进行了编号,通过这个编号,就可以准确定位到每字节的内存空间,这个编号,就是所谓的指针,并且我们在大多数情况下并不关注指针本身,而是关注通过这个指针能够找到的资源数据。然后很自然的会产生一个问题:操作系统是怎么产生这些编号的?

TCW1121的博客 1489
上一篇: C语言笔记归纳11:指针(2)
下一篇: C语言笔记归纳13:指针(4)
時語風華
博客等级 码龄1年 106粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值