重回C语言之老兵重装上阵(七)指针详解

news/2025/1/15 7:02:36/

指针是 C 语言中非常重要的概念,它是存储变量地址的变量。通过指针,我们可以间接地访问和修改内存中的数据。在 C 语言中,指针常用于数组、函数、动态内存分配等场景。理解指针对于写高效且灵活的程序至关重要。

1. 什么是指针?

指针是一个变量,用来存储另一个变量的地址。指针类型指示它所指向的变量类型,指针本身也有类型。

指针的声明

type *pointer_name;
  • type 是指针所指向的变量类型(如 int, char 等)。
  • * 表示这是一个指针变量。
  • pointer_name 是指针的名字。

示例:

int a = 10;   // 声明一个整型变量 a
int *p;       // 声明一个指向整型的指针 p
p = &a;       // p 存储 a 的地址

在这个例子中,&a 获取变量 a 的地址,并将其赋给指针 p

2. 指针的基本操作

2.1 取地址操作符 &

& 是取地址操作符,用于获取变量的内存地址。

int a = 10;
int *p = &a;  // p 存储 a 的地址

2.2 解引用操作符 *

* 是解引用操作符,用于访问指针指向的变量的值。通过 *p,我们可以访问指针 p 所指向的变量。

int a = 10;
int *p = &a;  // p 存储 a 的地址
printf("%d\n", *p);  // 输出 10,表示 p 指向的值

3. 指针与数组

在 C 语言中,数组名本身就是一个指向数组首元素的指针。因此,可以通过指针来访问数组元素。

数组名是指针

数组名是指向数组第一个元素的指针。例如,arr&arr[0] 是等价的,指向数组的首元素。

示例:

int arr[] = {1, 2, 3, 4, 5};
int *p = arr;  // p 指向数组的首元素printf("%d\n", *p);       // 输出 1
printf("%d\n", *(p + 1)); // 输出 2

数组和指针的关系:

arr[i]  等价于 *(arr + i)

4. 指针的类型

指针的类型是指针所指向的数据类型。每种类型的指针有不同的大小和语义。

示例:

int a = 10;
int *p = &a;   // p 是指向 int 类型数据的指针char c = 'A';
char *q = &c;  // q 是指向 char 类型数据的指针

不同类型的指针有不同的解引用方式。

5. 指针数组与数组指针

5.1 指针数组

指针数组是一个数组,其元素是指针。每个元素都指向某个类型的数据。

示例:

int a = 10, b = 20, c = 30;
int *arr[3] = {&a, &b, &c};  // arr 是一个指针数组printf("%d\n", *arr[0]);  // 输出 10

5.2 数组指针

数组指针是一个指针,指向整个数组。数组指针在声明时必须指定数组的大小。

示例:

int arr[3] = {1, 2, 3};
int (*p)[3] = &arr;  // p 是指向整数数组的指针printf("%d\n", (*p)[0]);  // 输出 1

6. 多级指针

多级指针是指向指针的指针。指向指针的指针用于访问间接指向的数据。

示例:

int a = 10;
int *p = &a;     // p 是指向 int 类型数据的指针
int **pp = &p;   // pp 是指向指针 p 的指针printf("%d\n", **pp);  // 输出 10

7. 动态内存分配与指针

C 语言提供了 malloccallocreallocfree 函数来进行动态内存分配。指针用于管理这些动态分配的内存。

示例:

int *arr;
//malloc(5 * sizeof(int))返回的void *无类型指针,可以进行类型转化为任意类型指针
arr = (int *)malloc(5 * sizeof(int));  // 动态分配 5 个整数的内存if (arr != NULL) {for (int i = 0; i < 5; i++) {arr[i] = i + 1;  // 给动态分配的内存赋值}for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);  // 输出 1 2 3 4 5}free(arr);  // 释放动态分配的内存
}

8. 总结

指针是 C 语言中非常强大且灵活的工具。通过指针,我们可以:

  • 直接操作内存。
  • 访问函数外部的变量(通过指针传递)。
  • 动态分配内存。
  • 实现高效的数组处理。

http://www.ppmy.cn/news/1563252.html

相关文章

Lua语言的计算机基础

Lua语言的计算机基础 Lua是一种轻量级、高效的脚本语言&#xff0c;广泛应用于游戏开发、嵌入式系统和网络编程等领域。作为一种通用语言&#xff0c;Lua的语法简洁&#xff0c;易于学习&#xff0c;非常适合用于快速开发和原型设计。本文将深入探讨Lua语言的计算机基础&#…

iOS - Objective-C语言的动态性

Objective-C 的动态性主要由以下几个关键特性和机制支撑&#xff1a; 1. 动态消息传递 // 消息传递机制 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取类信息Class cls object_getClass(self);// 2. 查找方法实现IMP imp lookUpImpOrForward(cls, _cmd);// 3. 执行…

MySQL(高级特性篇) 04 章——逻辑架构

一、逻辑架构剖析 &#xff08;1&#xff09;服务器处理客户端请求 那服务器进程对客户端进程发送的请求做了什么处理&#xff0c;才能产生最后的处理结果呢&#xff1f;这里以查询请求为例展示&#xff1a;下面具体展开看一下&#xff1a;Connectors是MySQL服务器之外的客户…

算法妙妙屋-------2..回溯的奇妙律动

回溯算法是一种用于系统性地搜索和解决问题的算法&#xff0c;它以深度优先搜索&#xff08;DFS&#xff09;为基础&#xff0c;用来探索所有可能的解决方案。通过递归地尝试候选解并在必要时回退&#xff08;即“回溯”&#xff09;&#xff0c;它能够高效地解决许多涉及组合、…

SQL LAST()

SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而&#xff0c;需要注意的是&#xff0c;这个函数并不是SQL标准的一部分&#xff0c;因此并不是所有数据库系统都支持它。具体来说&#xff0c;只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…

fastGpt 本地运行 mongo, 要加 directConnection=true 参数

fastGpt 本地运行 mongo psql用docker的 文件复制 FastGPT\projects\app.env.template 复制为 FastGPT\projects\app.env.local 本地 连接docker的mongo, 要加 directConnectiontrue 参数 MONGODB_URImongodb://myusername:mypasswordlocalhost:27017/fastgpt?authSourceadmi…

Java中的反射机制及其应用场景

目录 什么是Java反射机制&#xff1f; 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制&#xff1f; Java反射机制是一种强大的工具&#xff0c;它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射&#xff0c;开发者可以在不知道类的具体实现…

机器学习与人工智能的关系

机器学习与人工智能的关系 一、人工智能二、机器学习2.1 机器学习与人工智能的关系2.2 机器学习的本质 三、其他玩艺 曾几何时&#xff0c;人工智能还是个科幻名词&#xff0c;仿佛只属于未来世界。如今&#xff0c;它已经渗透到了我们生活的方方面面&#xff0c;成为顶流。我们…