首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >详解C语言指针(上):(含大厂面试实战哦!)指针运算、指针和数组、多级函数

详解C语言指针(上):(含大厂面试实战哦!)指针运算、指针和数组、多级函数

作者头像
艾莉丝努力练剑
发布2025-11-13 10:39:12
发布2025-11-13 10:39:12
3090
举报
文章被收录于专栏:C / C++C / C++

🔥个人主页艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》C语言刷题12天IO强训LeetCode代码强化刷题C/C++干货分享&学习过程记录 🍉学习方向:C/C++方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平


C++的两个参考文档:

老朋友(非官方文档):cplusplus 官方文档(同步更新):cppreference




一、指针的本质与内存模型

我们回顾一下有关指针概念的内容:

C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算

指针就是内存地址的具象化。在32位系统中,指针占4字节;64位系统中占8字节。

代码语言:javascript
复制
变量地址 = &变量
变量值 = *地址

变量地址就是变量取地址,变量值就是地址解引用。

大厂面试真题: 1、字节跳动:请解释int *p[10]int (*p)[10]的区别(2023年面试题) 2、腾讯:给定代码char *str = "hello"; str[0] = 'H';,为什么运行时会崩溃?(2022年笔试)

二、指针运算的炒鸡细节

C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算

指针加减不是简单的数值运算,而是按照指向类型的大小进行缩放——

代码语言:javascript
复制
int arr[5] = {0};
int *p = arr;
p++; // 实际移动sizeof(int)字节

下面这道题是华为常考的一道陷阱题:

代码语言:javascript
复制
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d %d", *(a+1), *(ptr-1)); 

问:输出什么?

答案:2 5

三、函数指针与回调实战

C语言指针深入详解(五):回调函数、qsort函数

下面我们来看一下一道阿里高频面试题

代码语言:javascript
复制
void (*signal(int sig, void (*func)(int)))(int);
// 请解析这个函数声明

感受一下函数指针与回调在实际工程当中的应用——

代码语言:javascript
复制
// 排序回调示例
void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

四、多级指针的深度剖析

关于多级指针,我们来看美团公司2023年的一道面试题——

代码语言:javascript
复制
int a = 10;
int *p = &a;
int **pp = &p;
int ***ppp = &pp;

printf("%d", ***ppp++); 

问题:输出什么?程序是否有问题?

五、指针与数组的关系

博主之前的文章也提到过指针与数组那剪不断理还乱的暧昧关系:

C语言指针深入详解(三):数组名理解、指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组

C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表

比如这些:

重要结论: 1、数组名在多数情况下退化为指针(数组名是首元素地址); 2、sizeof(arr)&arr时不会退化。

下面是拼多多的一道笔试题,我们来看一下——

代码语言:javascript
复制
char arr[] = "hello";
char *p = "hello";

printf("%zu %zu", sizeof(arr), sizeof(p)); 

问:64位系统输出?

答案:6 8

六、野指针与内存泄漏检测

C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用

下面这题是腾讯安全部门的一道必问题,大家试试看会不会做——

代码语言:javascript
复制
char *get_str() {
    char str[] = "hello";
    return str; // 为什么不能这样返回?
}

内存泄漏检测技巧:

代码语言:javascript
复制
#define malloc(size) debug_malloc(size, __FILE__, __LINE__)
#define free(ptr) debug_free(ptr, __FILE__, __LINE__)

七、指针在数据结构中的应用

博主更新的数据结构与算法的初级阶段内容当中,指针更是常客。

下面这道是百度算法岗的指针在数据结构中的应用相关的真题——

代码语言:javascript
复制
// 反转单链表
struct Node 
{
    int data;
    struct Node* next;
};

struct Node* reverse(struct Node* head) 
{
    struct Node *prev = NULL, *current = head, *next = NULL;
    while (current) 
    {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    return prev;
}

八、const与指针的排列组合

C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用

大厂常考const的四象限——

代码语言:javascript
复制
const int *p;       // 指向常量的指针
int const *p;       // 同上
int * const p;      // 常量指针
const int * const p;// 指向常量的常量指针

九、指针的阴招——Swap函数

我们之前在C语言部分已经介绍过这个样例了,这里不多赘述。

下面则是网易游戏的一道面试题:

代码语言:javascript
复制
// 不用临时变量交换两个数
void swap(int *a, int *b) 
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

这是非常简单也非常经典的一个Swap交换。

十、真题解析

这道题非常新,是2024年腾讯CSIG真题——

代码语言:javascript
复制
int main() 
{
    int a[5] = {1,2,3,4,5};
    int *p1 = (int*)(&a + 1);
    int *p2 = (int*)((int)a + 1);
    printf("%x %x", p1[-1], *p2); 
}

问你:小端模式下输出什么?


指针的邪修口诀: 1、指针加减看类型 2、数组名是特殊指针 3、多级指针像洋葱 4、函数指针用typedef 5、const修饰看*号左右

往期回顾:

【C/C++】详解内存对齐问题,C语言内存对齐整理

结语:本期内容到这里就全部结束了,希望对你有所帮助,别忘了给博主一键四连!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、指针的本质与内存模型
  • 二、指针运算的炒鸡细节
  • 三、函数指针与回调实战
  • 四、多级指针的深度剖析
  • 五、指针与数组的关系
  • 六、野指针与内存泄漏检测
  • 七、指针在数据结构中的应用
  • 八、const与指针的排列组合
  • 九、指针的阴招——Swap函数
  • 十、真题解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档