尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C 指针数组函数之间的关联

C 指针数组函数之间的关联
📅 发布时间:2026/6/19 10:51:02

可能经常会听到:指针常量、常量指针、指针数组、数组指针、指针函数、函数指针;函数指针数组,等这些听起来感觉向绕口令似的词汇;
可见数组、指针、函数之间是有很多联系的。比如看下面一段代码:

#include<stdio.h>
#include <string.h>int main() {char* str = "abc";char* str1 = "12";strcpy(str, str1);return 0;
}

运行起来怎么还报错了呢?如果你回答不上来,那说明弄清上面这些名词后面的细节是十分有必要的!今天本文就带领读者回顾一下这些名词背后的知识点!

指针常量、常量指针

指针常量和常量指针,都是指针;

指针常量:

形如:const char * str,意思是告诉使用者,指针指向了常量,请你不要试图通过指针修改所指向的变量;这种常用在函数参数中,防止在函数内部不小心修改了指针指向的变量的值。

常量指针:

形如:char * const str,意思是告诉使用者,指针被声明为常量,不要试图修改这个指针的值;即:不要试图修改指针指向的地址;数组名貌似就有这种性质,声明数组后,不可对数组再次进行初始化。

如何区分指针常量和常量指针

看const和的位置,const在的左边--常量指针;const在*的右边--指针常量。

指针数组、数组指针

#include <stdio.h>
#include <string.h>int main(void) {int arr[] = {1, 2, 3};int (*p_arr)[] = &arr;//数组指针printf("%d\n", (*p_arr)[1]);char *s1[] = {"hello", "world", "!"};//指针数组printf("%s\n", s1[2]);return 0;
}

image

指针数组

看后面两个字,重在“数组”;指针数组,是说有一个数组,它是由指针类型元素组成。

数组指针

看后面两个字,重在“指针”;数组指针,是说有一个指针,它指向了一个数组。

指针函数、函数指针

指针函数

看后面两个字,重在“函数”;指针函数,是说有一个函数返回值类型是指针类型。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int *mock(int size) {return malloc(sizeof(int) * size);
}int main(void) {int *p = mock(5);p[0] = 1;p[1] = 3;p[2] = 5;p[3] = 7;p[3] = 7;free(p);int number = p[2];return 0;
}

看一下执行情况:
image
image

函数指针

看后面两个字,重在“指针”;函数指针,是说有一个指针变量,它指向一个函数。

#include <stdio.h>
#include <string.h>int add(int a, int b) {return a + b;
}int main(void) {int (*p_add)(int, int);//函数指针p_add = &add;//将函数add的地址赋值给函数指针int ret = (*p_add)(1, 2);return 0;
}

看add函数在内存中是什么类型:
image

实用技巧

常量指针做函数形参

为防止在函数内部,通过指针修改函数外部变量的值;函数参数通常定义为常量指针。
image

数组做函数形参

请看下面的函数形式:

#include <stdio.h>void test1(int a[10]) {printf("in test1 size is :%lu\n", sizeof(a));
}void test2(int a[]) {printf("in test2 size is :%lu\n", sizeof(a));
}void test3(int *a) {printf("in test3 size is :%lu\n", sizeof(a));
}int main(void) {int arr[10] = {0};test1(arr);test1(arr);test1(arr);return 0;
}

输出

in test1 size is :8
in test1 size is :8
in test1 size is :8

由于数组做函数形参会退化成指针,而对指针求sizeof得到的是指针类型占用的空间;并不能得到数组占用的空间;所以数组做函数形参时,通常还需再定义一个参数:数组的长度。
void test4(int arr[], int n);

函数指针做函数形参

使用函数指针做函数形参,可以实现函数回调的效果;如下面示例,便演示了一个简单的发布、订阅机制。

#include <stdio.h>
#include <strings.h>typedef void (*func)(void);int _index;func func_arr[10];void add_handler(void (*callback)()) {if (callback != NULL && _index < 10) {func_arr[_index++] = callback;}
}void raise_event() {int n = 0;for (; n < _index; n++) {if (func_arr[n] != NULL) {func_arr[n]();}}
}void test1() {printf("test1...\n");
}void test2() {printf("test2...\n");
}int main(void) {add_handler(test1);add_handler(test2);raise_event();return 0;
}

效果:

test1...
test2...

以上便是数组、指针和函数之间的关联的介绍。

相关新闻

  • 逻辑回归(随笔)
  • 这封邮件写得真好,是你自己写的吗? 不,是AI写的
  • 灵活用工-连续劳务-计算器工具类,拿走不谢

最新新闻

  • 大兴安岭地区黄金回收去哪儿好?整理了5家靠谱实体店地址电话 - 三大殿
  • 承德市今日黄金回收价格多少?本地5家口碑门店报价参考 - 马刺总冠军
  • 2026 正规备案收金店,称重透明结算无隐藏扣费 - 讯息早知道
  • 贺州市黄金回收实体店怎么选?这份清单帮你货比三家 - 开始就结束
  • 金华市黄金回收猫腻多怎么办?整理了5家诚信回收店供参考 - 三大殿
  • 2026安徽省宣城市中考一两百分怎么办?口碑优选宠物护理专业最新发布 - cc江江

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号