C语言—指针进阶(详解篇)

本文详细介绍了C/C++中的指针概念,包括字符指针、指针数组、数组指针以及函数指针的定义、用法和区别。通过实例解析了它们在内存管理和函数参数传递中的应用,并探讨了回调函数的概念。此外,还展示了如何使用函数指针数组实现简单的计算器功能。
摘要由CSDN通过智能技术生成

目录

1.字符指针

1.1字符指针定义

1.2 字符指针用法

2.指针数组

2.1 指针数组定义及使用

3.数组指针

3.1 数组指针定义

3.2 &数组名和数组名 

 3.3 数组指针的基本用法

4. 数组参数、指针参数 

5. 函数指针 

5.1 函数指针定义既基本使用

5.2 有趣的代码 

6. 函数指针数组 

6.1 函数指针数组定义

6.2 函数指针数组用法 

6.3 指向函数指针数组的指针 

7. 回调函数 

7.1 回调函数定义

7.2 回调函数使用 


在初学指针的时候你是否也常常分不清楚 ’指针数组‘ 和 ’数组指针‘ 呢?

结果是指针数组是数组,数组指针是指针,那快来学习一下这篇好文,更深刻的了解吧

前面初阶指针中学习了一下指针的基本概念:

1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
4. 指针的运算
http://t.csdn.cn/wsHNl​​​​​​

1.字符指针

1.1字符指针定义

在指针类型中我们知道一种指针类型为:char*

一般情况就是存放字符变量地址的指针

int main()
{
	char a = 'w';
	char* pc = &a;
	return 0;
}

除去存放字符变量地址这个用法外还有其他的用法:

首先知道字符串常量:一对双引号括起来的字符序列

int main()
{
	const char* pc = "abcdef";
	//字符串"abcdef"是常量,不可被修改所以加上const修饰
	printf("%c\n", *pc); // 'a'
	printf("%s\n", pc);  // "abcdef"
	return 0;
}

这么一串代码字符指针pc存放的是字符串"abcdef"的首元素地址,所以如果打印一个字符:解引用pc打印结果就是字符串的首元素‘a’,知道了首元素既可通过字符指针pc打印字符串

1.2 字符指针用法

字符指针经典面试题:题源《剑指offer》

int main()
{
	char str1[] = "hello world.";
	char str2[] = "hello world.";
	const char* str3 = "hello world.";
	const char* str4 = "hello world.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");
	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
	return 0;
}

输出结果:

str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

2.指针数组

2.1 指针数组定义及使用

指针数组是一个存放指针的数组。

int main()
{
	char* pch[5]; // 字符指针数组
	int* parr[5];//  整形指针数组
	char** ppch[5]; //二级字符指针数组
	return 0;
}

指针数组用法:将三个一维数组通过指针变成二维数组并输出打印

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* arr[] = { arr1,arr2,arr3 };//定义一个指针数组存放arr1、2、3,的首元素地址
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
//			*(arr[i]+j)=arr[i][j] 通过i分别找出arr1、2、3并通过j找出所对于的数
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

3.数组指针

3.1 数组指针定义

数组指针是指向数组的指针 

数组指针表示形式:

int main()
{
	int arr[10] = { 0 };
	int(*p)[10] = &arr;//取出的arr数组的地址
//  取出arr的地址,元素个数10,每个元素类型为int
	return 0;
}

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值