C语言---指针

文章目录

  • [1. 基本概念](#1. 基本概念)
  • [2. 指针的定义与初始化](#2. 指针的定义与初始化)
  • [3. 核心操作符](#3. 核心操作符)
  • [4. 指针的常见用途](#4. 指针的常见用途)
  • [5. 特殊指针类型](#5. 特殊指针类型)
  • [6. 指针的算术运算](#6. 指针的算术运算)
    • [7. 多级指针(指向指针的指针)](#7. 多级指针(指向指针的指针))
  • [8. 总结:为什么要用指针?](#8. 总结:为什么要用指针?)

指针(Pointer)是 C 语言的灵魂,也是它强大且灵活的核心原因。简单来说,指针就是内存地址。

1. 基本概念

在计算机内存中,每个字节都有一个唯一的编号,这个编号就是地址。

变量:是内存空间的别名,存储的是具体的值。

指针变量:是一种特殊的变量,它存储的是另一个变量的内存地址。

2. 指针的定义与初始化

定义指针时,使用 * 符号表示该变量是一个指针。

bash 复制代码
int a = 10;      // 普通整型变量
int *p;          // 定义一个指向整型数据的指针变量 p
p = &a;          // 将变量 a de 地址赋值给 p(& 是取地址符)

3. 核心操作符

& (取地址符):获取变量在内存中的地址。

  • (解引用符/间接访问符):获取指针所指向的地址中存储的值。
bash 复制代码
printf("a 的地址: %p\n", &a); // 输出地址
printf("p 的值: %p\n", p);   // 输出地址(与上面相同)
printf("p 指向的值: %d\n", *p); // 输出 10

4. 指针的常见用途

4.1、改变函数外部的变量(传址调用)

C 语言函数参数是值传递。如果想在函数内部修改外部变量,必须传递指针。

bash 复制代码
void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

4.2、数组与指针

数组名在大多数情况下会被视为指向数组首元素的指针。

bash 复制代码
int arr[3] = {10, 20, 30};
int *ptr = arr; // 等价于 ptr = &arr[0]
printf("%d", *(ptr + 1)); // 输出 20(指针算术运算)

4.3、动态内存分配

使用 malloc 或 calloc 在程序运行时申请内存,返回的就是指针。

bash 复制代码
int *p = (int *)malloc(sizeof(int) * 10); // 申请 10 个整数的空间

5. 特殊指针类型

空指针 (NULL):不指向任何有效地址的指针。初始化指针时建议设为 NULL,防止出现"野指针"。

坏指针/野指针:指向非法内存区域的指针,直接使用会导致程序崩溃(Segmentation Fault)。

void 指针 (void *):通用指针类型,可以指向任何类型的数据,但在使用前必须进行强制类型转换。

6. 指针的算术运算

指针可以进行加减运算,但其步长取决于指针指向的数据类型:

int *p; p++; ------ 地址增加 sizeof(int)(通常是 4 字节)。

char *p; p++; ------ 地址增加 sizeof(char)(1 字节)。

int *p; p--; ------ 地址减少 sizeof(int)(通常是 4 字节)。

char *p; p--; ------ 地址减少 sizeof(char)(1 字节)。

7. 多级指针(指向指针的指针)

指针本身也是变量,也有地址,所以可以用另一个指针来存储指针的地址。

bash 复制代码
int a = 10;
int *p = &a;
int **pp = &p; // 二级指针

8. 总结:为什么要用指针?

效率:传递指针比传递大型结构体或数组快得多(只需复制 4 或 8 字节的地址)。

动态性:支持在运行时分配内存。

底层操作:可以直接访问硬件地址或处理复杂的链表、树等数据结构。

推荐文章

https://www.runoob.com/cprogramming/c-pointers.html

相关推荐
StandbyTime3 小时前
C语言学习-菜鸟教程C经典100例-练习43
c语言
ygklwyf3 小时前
JPRS编程竞赛2026#1(AtCoder初学者竞赛442)
c++·算法·模拟
学嵌入式的小杨同学3 小时前
【嵌入式 Linux 实战 1】Ubuntu 环境搭建 + 目录结构详解:嵌入式开发入门第一步
linux·c语言·开发语言·数据结构·vscode·vim·unix
老鼠只爱大米3 小时前
LeetCode经典算法面试题 #21:合并两个有序链表(迭代法、原地合并法等多种实现方案详解)
算法·leetcode·链表·优先队列·迭代法·合并两个有序链表·原地合并
源代码•宸3 小时前
Leetcode—47. 全排列 II【中等】
经验分享·后端·算法·leetcode·面试·golang·深度优先
wen__xvn3 小时前
基础算法集训第20天:Dijkstra
算法·图论
Ada's4 小时前
【计算机基础系列】001:计算机科学与技术
数据结构
Yiyaoshujuku4 小时前
疾病的发病率、发病人数、患病率、患病人数、死亡率、死亡人数查询网站及数据库
数据库·人工智能·算法
wen__xvn4 小时前
基础算法集训第18天:深度优先搜索
算法·深度优先·图论
17(无规则自律)4 小时前
【CSAPP 读书笔记】第一章:计算机系统漫游
linux·c语言·arm开发·嵌入式硬件·学习·ubuntu