C 指针详解

简介: C 语言中的指针是一个强大而重要的概念,用于间接访问变量的存储地址。指针是一个变量,存储其他变量的地址,类型与其指向的数据类型相关。基本操作包括取地址 (`&`) 和解引用 (`*`)。指针使用前需初始化,可指向有效地址或为空 (`NULL`)。指针支持算术运算,可用于数组和函数。通过 `malloc` 和 `free` 可管理动态内存。多级指针允许存储指针的地址。使用指针时需注意初始化、防止内存泄漏及避免访问无效地址。掌握指针是精通 C 语言的关键。

C 语言中的指针是一个重要且强大的概念,用于间接访问变量的存储地址。以下是 C 指针的详细讲解:

1. 指针的定义

指针是一个变量,它存储了另一个变量的地址。指针的类型通常与它所指向的数据类型相关联。

int a = 10;
int *p; // p 是一个指向 int 类型的指针
p = &a; // 将 a 的地址赋值给 p

2. 指针的基本操作

  • 获取地址:使用取地址符 & 获取变量的地址。
  • 解引用:使用解引用符 * 访问指针所指向的地址的值。
printf("%d\n", *p); // 输出 a 的值,即 10

3. 指针的初始化

指针在使用之前必须初始化,可以指向一个已有变量的地址。

int b = 20;
int *ptr = &b; // ptr 现在指向 b 的地址

4. 空指针

空指针是一个特定值(通常为 NULL),表示指针不指向任何有效的地址。

int *ptr = NULL; // ptr 初始化为空指针

5. 指针的算术运算

指针支持加减法运算。这是因为指针的值是基于类型尺寸的。例如,增加一个整数指针的值意味着跳过一个整数的长度。

int arr[3] = {
   1, 2, 3};
int *p = arr; // p 指向 arr[0]
p++; // p 现在指向 arr[1]

6. 指针数组与数组指针

  • 指针数组:数组的每个元素都是指针。
int *arr[3]; // 定义一个可以存储 3 个 int 指针的数组
  • 数组指针:指向数组的指针。
int (*p)[3] = &arr; // p 是一个指向包含 3 个整数的数组的指针

7. 函数指针

指针可以指向函数,允许通过指针调用函数(实现回调)。

void func(int x) {
   
    printf("%d\n", x);
}

void (*fPtr)(int) = func; // fPtr 是一个指向 func 的指针
fPtr(5); // 调用 func

8. 指针和内存管理

C 语言中经常通过指针直接操作内存,动态内存分配使用 malloccallocreallocfree 来管理。

int *dynamicArray = (int *)malloc(10 * sizeof(int)); // 分配内存
if (dynamicArray == NULL) {
   
    // 处理内存分配失败
}
free(dynamicArray); // 释放内存

9. 多级指针

指针的指针(多级指针)允许存储指针的地址。可以有二级指针(int **),三级指针(int ***),依此类推。

int **pp; // 指向指针的指针

10. 注意事项

  • 初始化指针:在使用指针前,确保它们指向一个有效的地址。
  • 防止内存泄漏:在不再需要动态分配的内存时,使用 free 释放它。
  • 访问无效地址:解引用未初始化或 NULL 指针会导致未定义行为。

理解指针的概念和应用是掌握 C 语言的关键之一,通过练习和实际应用,能够更好地驾驭这一强大工具。

相关文章
|
移动开发 小程序 JavaScript
【小程序质量提优解决方案】(二)内嵌H5加载异常(404)
【小程序质量提优解决方案】(二)内嵌H5加载异常(404)
836 0
|
11月前
EndNote文献管理工具!研究生必备软件!超详细下载安装教程(附下载地址)
EndNote是一款全球广泛使用的专业文献管理工具,集文献整理、引用写作与协同管理于一体,助力科研高效进行。安装时需关闭杀毒软件,按步骤完成即可。
6143 6
|
9月前
|
机器学习/深度学习 算法 安全
PAC(Probably Approximately Correct)理论简介
PAC理论(概率近似正确)由Leslie Valiant提出,是机器学习的基础理论,用于分析模型在有限数据下以高概率学会近似正确规律的条件,涵盖可学习性、样本与计算复杂度,虽具理想化假设,但仍为算法设计提供重要框架。
1447 0
|
缓存 数据库
读写锁和互斥锁的区别
【10月更文挑战第6天】
1120 156
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
624 3
Golang语言之函数(func)进阶篇
|
机器学习/深度学习 数据采集 监控
算法金 | 选择最佳机器学习模型的 10 步指南
许多刚入门的学习者也面临着相似的挑战,特别是在项目启动初期的方向确定和结构规划上。本文意在提供一份全面指南,助你以正确的方法开展项目。 遵循本文提供的每一步至关重要(虽有少数例外)。就像不做饭或点餐就无法享用美食一样,不亲自动手构建模型,就无法实现模型部署。
744 7
算法金 | 选择最佳机器学习模型的 10 步指南
|
索引 Python
Python 中的负索引是什么?
【8月更文挑战第29天】
1321 1
|
传感器 算法 机器人
基于Arduino的3D打印六足机器人
基于Arduino的3D打印六足机器人
770 0
|
机器学习/深度学习 算法 数据处理
机器学习归一化特征编码(一)
特征缩放是机器学习预处理的关键步骤,它包括归一化和标准化。归一化通过最大最小值缩放,将数据转换到[0,1]区间,有助于梯度下降算法更快收敛,减少数值较大特征的影响。标准化则通过减去均值并除以标准差,确保数据具有零均值和单位方差,适用于关注数据分布情况的算法。例如,欧氏距离计算时,未归一化的特征可能导致模型偏向数值较大的特征。归一化能提升模型精度,尤其是当距离度量如欧式距离时。常见的实现方法有`MinMaxScaler`,它将每个特征值缩放到用户指定的范围,如[0,1]。而`StandardScaler`执行Z-Score标准化,数据分布符合标准正态分布。
|
弹性计算 Kubernetes 大数据
阿里云弹性扩容方案选择
阿里云弹性扩容方案选择

热门文章

最新文章