
🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C++干货分享&学习过程记录 🍉学习方向:C/C++方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平
C++的两个参考文档:
老朋友(非官方文档):cplusplus 官方文档(同步更新):cppreference
我们回顾一下有关指针概念的内容:

C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算
指针就是内存地址的具象化。在32位系统中,指针占4字节;64位系统中占8字节。
变量地址 = &变量
变量值 = *地址变量地址就是变量取地址,变量值就是地址解引用。
大厂面试真题: 1、字节跳动:请解释
int *p[10]和int (*p)[10]的区别(2023年面试题) 2、腾讯:给定代码char *str = "hello"; str[0] = 'H';,为什么运行时会崩溃?(2022年笔试)
C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算
指针加减不是简单的数值运算,而是按照指向类型的大小进行缩放——


int arr[5] = {0};
int *p = arr;
p++; // 实际移动sizeof(int)字节下面这道题是华为常考的一道陷阱题:
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d %d", *(a+1), *(ptr-1)); 问:输出什么?
答案:2 5
下面我们来看一下一道阿里高频面试题:
void (*signal(int sig, void (*func)(int)))(int);
// 请解析这个函数声明感受一下函数指针与回调在实际工程当中的应用——
// 排序回调示例
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));关于多级指针,我们来看美团公司2023年的一道面试题——
int a = 10;
int *p = &a;
int **pp = &p;
int ***ppp = &pp;
printf("%d", ***ppp++); 问题:输出什么?程序是否有问题?
博主之前的文章也提到过指针与数组那剪不断理还乱的暧昧关系:
C语言指针深入详解(三):数组名理解、指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组
C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
比如这些:

重要结论: 1、数组名在多数情况下退化为指针(数组名是首元素地址); 2、
sizeof(arr)和&arr时不会退化。
下面是拼多多的一道笔试题,我们来看一下——
char arr[] = "hello";
char *p = "hello";
printf("%zu %zu", sizeof(arr), sizeof(p)); 问:64位系统输出?
答案:6 8
C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用
下面这题是腾讯安全部门的一道必问题,大家试试看会不会做——
char *get_str() {
char str[] = "hello";
return str; // 为什么不能这样返回?
}内存泄漏检测技巧:
#define malloc(size) debug_malloc(size, __FILE__, __LINE__)
#define free(ptr) debug_free(ptr, __FILE__, __LINE__)博主更新的数据结构与算法的初级阶段内容当中,指针更是常客。
下面这道是百度算法岗的指针在数据结构中的应用相关的真题——
// 反转单链表
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;
}C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用
大厂常考const的四象限——
const int *p; // 指向常量的指针
int const *p; // 同上
int * const p; // 常量指针
const int * const p;// 指向常量的常量指针我们之前在C语言部分已经介绍过这个样例了,这里不多赘述。
下面则是网易游戏的一道面试题:
// 不用临时变量交换两个数
void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}这是非常简单也非常经典的一个Swap交换。
这道题非常新,是2024年腾讯CSIG真题——
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修饰看*号左右
往期回顾:
结语:本期内容到这里就全部结束了,希望对你有所帮助,别忘了给博主一键四连!