C/C++ 指针详解与各种指针定义 - 指南

news/2025/10/13 22:10:28/文章来源:https://www.cnblogs.com/tlnshuju/p/19139534

C/C++ 指针详解与各种指针定义 - 指南

2025-10-13 22:09  tlnshuju  阅读(0)  评论(0)    收藏  举报

在 C/C++ 学习过程中,指针 是一大难点。很多初学者一看到 int *p[10];int (*p)[10]; 或者 int (*f)(int); 就一脸懵。本文就从指针的基础开始,逐步过渡到各种复杂的定义,并配合示例进行解释,帮助你彻底搞懂指针。


一、认识指针

指针是 保存地址的变量。在 C 语言中,所有对象(变量、数组、函数)在内存中都有地址。指针变量就是用来存储这些地址,并间接访问目标对象。

例如:

int a = 10;
int *p = &a; // p 保存了变量 a 的地址
printf("%d\n", *p); // 输出 10

为什么需要指针?

  1. 通过指针可以访问和修改其他变量的值;

  2. 指针可以用来操作数组、字符串;

  3. 动态内存分配必须使用指针;

  4. 指针是函数参数传递大数据的高效方式;

  5. 函数指针可以实现回调和“面向接口”的设计。


二、各种指针的定义

我们来看一些常见的指针定义。技巧:从变量名往外读,结合括号优先级

  • 一个整形数:
int a;
  • 一个指向整形数的指针:

int *a;
  • 一个指向指针的指针,它指向的指针指向一个整形数:

int **a;
  • 一个有 10 个整形数的数组:

int a[10];
  • 一个有 10 个指针的数组,每个指针指向一个整形数:

int *a[10];
  • 一个指向有 10 个整形数的数组的指针:

int (*a)[10];
  • 一个指向指针的指针,被指向的指针指向一个有 10 个整形数的数组:

int (**a)[10];
  • 一个指向数组的指针,该数组有 10 个整形指针:

int *(*a)[10];
  • 一个指向函数的指针,该函数有一个整形参数并返回一个整形数:

int (*a)(int);
  • 一个有 10 个指针的数组,每个指针指向一个函数,该函数有一个整形参数并返回一个整形数:

int (*a[10])(int);
  • 一个函数指针,指向的函数有两个整形参数,并且返回一个函数指针;返回的函数指针指向一个函数,该函数有一个整形参数并返回整形数:

int (*(*a)(int, int))(int);

三、指针与数组

1.指针引用数组

int arr[5] = {1,2,3,4,5};
int *p = arr;   // 等价于 &arr[0]
printf("%d\n", *(p+2)); // 输出 3

2.指针和二维数组

int arr[3][4];
int (*p)[4] = arr;  // p 指向一个有 4 个元素的数组
  • 数组指针 vs 指针数组

    • int (*p)[10]; → 数组指针,p 指向一个整型数组

    • int *p[10]; → 指针数组,p 是数组,里面每个元素是整型指针


四、二维数组与指针的关系(重点)

二维数组在内存中是按行顺序存储的,本质上可以看作“一维数组的数组”。理解这一点对于写对指针运算非常关键。下面举例说明(假设 int a[3][4] 的基地址是 2000,每个元素占 4 字节):

表达式含义地址/值
a数组名,指向第 0 行数组(a[0]2000
a[0] / *(a+0) / *a第 0 行第 0 列元素地址2000
a+1 / &a[1]第 1 行首地址2016
a[1] / *(a+1)第 1 行第 0 列元素地址2016
a[1]+2 / *(a+1)+2 / &a[1][2]第 1 行第 2 列元素地址2024
*(a[1]+2) / *(*(a+1)+2) / a[1][2]第 1 行第 2 列元素的值(假设为 13)13

规律:

  • a[i] 相当于第 i 行首地址

  • a[i]+j 相当于第 i 行第 j 列元素地址

  • *(*(a+i)+j) 相当于 a[i][j] 的值

这个表能帮助你彻底掌握二维数组和指针的对应关系。


五、函数指针

函数在内存中也有地址,指针可以指向函数。

int add(int x, int y) { return x + y; }
int (*pf)(int,int) = add;
printf("%d\n", pf(2,3)); // 输出 5

函数指针常用于:

  • 回调函数(如 qsort

  • 策略模式(选择不同的函数执行)


六、qsort 与函数指针(重点)

qsort 是 C 标准库 <stdlib.h> 提供的一个快速排序函数,使用时需要 传入一个函数指针作为比较函数

函数原型

void qsort(void *base,         // 待排序数组的首地址size_t num,         // 元素个数size_t size,        // 每个元素的大小(字节数)int (*cmp)(const void*, const void*) // 比较函数指针
);

参数说明

  1. base → 待排序数组首地址

  2. num → 元素个数

  3. size → 每个元素大小(用 sizeof

  4. cmp比较函数,需要用户自己写,返回值规则:

  • < 0:第一个元素在前
  • = 0:相等
  • >0:第一个元素在后

示例 1:排序整型数组

#include 
#include 
// 比较函数:升序
int cmpInt(const void *a, const void *b) {return *(int*)a - *(int*)b;
}
int main() {int arr[] = {42, 15, 7, 23, 4};int n = sizeof(arr) / sizeof(arr[0]);qsort(arr, n, sizeof(int), cmpInt);for(int i=0; i

输出:

4 7 15 23 42

示例 2:按字符串长度排序

#include 
#include 
#include 
int cmpStrLen(const void *a, const void *b) {const char *s1 = *(const char**)a;const char *s2 = *(const char**)b;return strlen(s1) - strlen(s2);
}
int main() {const char *arr[] = {"apple", "banana", "pear", "grape"};int n = sizeof(arr) / sizeof(arr[0]);qsort(arr, n, sizeof(char*), cmpStrLen);for(int i=0; i

输出:

pear grape apple banana

规律:

  • qsort 的精髓在于“比较函数指针

  • 通过函数指针,qsort 可以对任意类型进行排序(整型、浮点型、字符串、结构体等)

  • 这就是函数指针在 C 语言里“回调函数”的经典应用


七、多级指针

  • 二级指针int **pp;
    常用于:

    • 动态内存分配二维数组

    • 修改指针本身的值(如 char **argv

  • 多级指针int ***ppp;
    实际项目中一般用在链表、树等复杂数据结构。


八、总结

  1. 指针是存放地址的变量,是 C 语言的精华。

  2. 理解指针声明的技巧:从变量名往外读,注意括号优先级。

  3. 常见指针包括:

    • 指向基本类型的指针

    • 指针数组、数组指针

    • 函数指针、指针函数

    • 多级指针

  4. 二维数组和指针的关系一定要通过“地址运算表”掌握,写程序时才不会乱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14 10.13

上了数据结构 统一建模语言 Java跑步了背了单词

日志|前端框架Vue

Vue是一款用于构建用户界面的渐进式的JavaScript框架1)2)3)v-bindv-onv-if v-else-if v-else = v-showv-forv-实例演示vue生命周期的挂载完成提示

oop.shiyan1

实验1 源代码:1 #include<iostream>2 #include<string>3 #include<vector>4 #include<algorithm>5 6 //模版函数声明7 template<typename T>8 void output(const T& c);9 10 void …

玄机——第一章 应急响应-Linux日志分析 wp

简介 账号root密码linuxrz ssh root@IP 1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割 3.爆破用户名字典是什么?如果有多个使…

第四周第五天4.5

所用时间:180分钟 代码量(行):0 了解到的知识点: 1.无约束问题方法求解 无约束问题的核心求解方法分为解析法和数值迭代法,前者直接求导找最优解,后者通过逐步迭代逼近最优解 解析法仅适用于目标函数可微且能通…

深入解析:flutter AudioPlayer的使用问题及处理

深入解析:flutter AudioPlayer的使用问题及处理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

11 10.10

学习了看书了

12 10.11

出去玩儿了 学习了

P3330 [ZJOI2011] 看电影

思路 第一眼看去好像并没有什么思路,于是我们通过手算或者暴力搜索打了一个表, 当 \(n = 2\) 时,当 \(k\) 变化时,答案如表所示n\ k 1 2 3 41 (1, 1) (2, 2) (3, 3) (4, 4)2 (0, 1) (3, 4) (15, 16) (24, 25)3 (0,…

09 面向对象基础概念的总结

09 面向对象基础概念的总结面向对象 总结类与对象的定义 类是一个模板,是抽象的,将一些元素的共性集合在一起。 对象是具体的实例,创建对象的过程叫做实例化。方法 方法的定义: 修饰符 返回值 函数名 参数 函数体对…

20232315 2025-2026-1 《网络与系统攻防技术》实验一实验报告

一、实验目标 对一个名为pwn1的linux可执行文件: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己…

CSP-S 2025 提高级模拟赛 Day6 复盘 B.连通子图

题意 给定正整数 \(k\),求构造一棵树,使得包含了1号点的连通子图个数恰好为 \(k\)。 赛时做法 没想出来,骗了个 \(n\leq60\) 的20pts部分分(输出一条长度为 \(k\) 的链,此时一定有 \(k\) 个联通子图) #include&l…

基于Java的家政服务管理优秀的系统的设计与完成-计算机毕设 附源码05300

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android Camera openCamera - 教程

Android Camera openCamera - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

大作业第一阶段验收小组集体加5分 -

大作业第一阶段验收小组集体加5分任务二 小组:郝正一,文利,武浩翔 验收集体加5分

业务定义与指标体系搭建

一、指标 1、什么是指标? 定义:衡量目标的方法,构成要素有维度+汇总方式+度量 2、好的指标 = 可比较(增量>全量,优先比率/比例,慎用绝对值) + 预见性(领先>滞后) + 行动导向(过程型 > 结果性) 3、…

Linux使用笔记

Linux使用笔记Ubuntu替换“系统启动界面”图片sudo cp yourlogo.png /usr/share/plymouth/themes/spinner/watermark.png // 若要替换“登录”界面的图片: sudo cp yourlogo.png /usr/share/plymouth/Ubuntu-logo.png…

[Vulhub靶机]W1R3S靶机渗透

[红队渗透]Vulhub-W1R3S靶机渗透 靶机W1R3S下载地址以及配置: https://download.vulnhub.com/w1r3s/w1r3s.v1.0.1.zip 直接使用nat模式把靶机设置为和攻击机(kali)同一个网段 kali:192.168.88.133渗透流程思路: 1.信…