C语言指针进阶

1. 字符指针 (Character Pointer)

字符指针 char* 有两种常见使用方式:

  1. 指向一个字符变量。
  2. 指向一个字符串常量(首字符的地址)。
cpp 复制代码
int main() {
    // 方式1:指向字符变量
    char ch = 'w';
    char *pc = &ch;

    // 方式2:指向字符串常量
    // 本质是将字符串"hello bit."的首字符地址放到了pstr中
    const char *pstr = "hello bit."; 
    printf("%s\n", pstr);
    return 0;
}

注意: 当多个指针指向同一个常量字符串时,它们实际指向同一块内存区域。但如果是用常量字符串初始化不同的数组,数组会开辟不同的内存块。

2. 指针数组 (Pointer Array)

定义: 指针数组是一个数组 ,它的每个元素都是一个指针。

cpp 复制代码
int *arr1[10];    // 整形指针的数组,存放 int*
char *arr2[4];    // 字符指针的数组,存放 char*
char **arr3[5];   // 二级字符指针的数组,存放 char**

3. 数组指针 (Array Pointer)

定义: 数组指针是一个指针 ,它指向一个数组。

语法: int (*p)[10];

解释: p 先和 * 结合,说明 p 是一个指针,然后指向一个大小为10的整型数组。由于 [] 优先级高于 *,必须加上 ()。

关键点:数组名 vs &数组名

  • arr:通常表示数组首元素的地址。
  • &arr:表示整个数组的地址。
  • 虽然 arr 和 &arr 打印出的地址值相同,但它们的意义(类型)不同。arr+1 跳过一个元素,&arr+1 跳过整个数组。

应用:二维数组传参

数组指针常用于二维数组的参数传递,因为二维数组的数组名表示"第一行"的地址(即一个一维数组的地址)。

4. 数组与指针传参 (Parameter Passing)

4.1 一维数组传参

形参可以是数组形式 arr[],也可以是指针形式 *arr。

4.2 二维数组传参

形参可以是数组形式 arr[][5] (列数不能省),也可以是数组指针形式 (*arr)[5]。

4.3 二级指针传参

当形参为 int **ptr 时,可以接收:二级指针变量、一级指针的地址 (&p)、或者指针数组 (int *arr[])。

5. 函数指针 (Function Pointer)

定义: 指向函数的指针,存放函数的地址。

语法: return_type (*pointer_name)(param_types)

cpp 复制代码
void test() { printf("hehe\n"); }

int main() {
    // 两种写法都可以取到函数地址
    // &test 和 test 等价 void (*pfun)() = test; // pfun 是函数指针变量 (*pfun)(); // 调用方式 1
    pfun();    // 调用方式 2
    return 0;
}
相关推荐
星夜离尘567 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
_Evan_Yao7 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
Ai-_Man8 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd8 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼8 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
学逆向的8 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_9 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
thefool1122669 小时前
TCP 1
java·1024程序员节
企业数字化笔记11 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
金銀銅鐵11 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程