当前位置: 首页 > news >正文

day15 C语言 指针3

13.字符指针的常见错误

#include<stdio.h>

#if 0

int main(int argc, char **argv)

{

//char *p="hello"; //error,会发生段错误 hello在内存中只有一份,只能读取不能修改

char p[]="hello"; //char [] 开辟空间,会把hello复制一份给数组

printf("%s\n",p);

*(p+0)='e'; //如果是指针,操作是错误,不能修改常量

p[0]='e'; //如果是数组,操作是对的,修改的是数组里的内容,不是字符串常量

printf("%s\n",p);

return 0;

}

#endif

void swap(int *a,int *b)

{

int *t; //int t; //此处*t是野指针,没有初始化,所以会发生段错误

*t=*a; //t=*a;

*a=*b;

*b=*t; //*b=t

}

int main(int argc, char **argv)

{

int a=9;

int b=12;

swap(&a, &b);

return 0;

}

14.函数指针,指针函数

1.指针函数:

函数的返回值是指针类型。

eg: char *strcpy(char *dest,const char *src);

strcpy 这个函数的返回值,就是一个指针。 成功,指针指向 dest。

  1. 不能返回是局部作用域的指针。(会被释放)
  2. 希望函数可以连续调用,在同一个语句里面。
  3. 希望返回一端内存区域(数组(首地址)、堆空间)

eg:

char *mystrcat(char *dst,char *src)

{

char *temp=dst;

while(*dst)

{

dst++;

}

while(*src)

{

*dst=*src;

dst++;

src++;

}

*dst='\0';

returntemp; //返回数组首地址

}

int main(int argc, char **argv)

{

char str1[100]="hello";

char str2[100]="ok";

char str3[100]={0};

mystrcat(str3, mystrcat(str1,str2)); //函数可以连续调用,在同一个语句里面。

printf("str3 is %s\n",str3);

return 0;

}

2.函数指针
  1. 本质:指针变量
  2. 函数指针:指向一个函数(前面介绍的指针基本都是指数据)
  3. 函数名:是地址值。里面存储的代码 对数据进行加减乘除操作的。
  4. 目的:避免代码的重复;方便后期代码的拓展;函数功能的解耦合
  5. 回调函数:把一个函数当作参数传给另一个函数,被传递的这个参数(函数指针/回调函数);被动调用。主调函数只是传参(函数)。

eg1:

int add(int a,int b)

{

return a+b;

}

int main(int argc, char **argv)

{

//p是函数指针 add不能写为add(),因为不是对add函数的调用

//定义函数指针p存储add的地址 类似于 int a[10]=0; int *p=a;

int (*p) (int,int)=add;

int a=12;

int b=20;

int ret=0;

ret=add(a,b);

printf("add is %d\n",ret);

ret=p(a,b); //函数本身就算地址 不用加* 通过函数指针对函数的调用

printf("add is %d\n",ret);

return 0;

}

eg2:

int div3(int num) // int (*) (int)

{

return 0==num%3;

}

void find_num(int *a,int size,int (*fun) (int)) //回调函数

{

for(size_t i=0;i<size;i++)

{

if(fun(a[i])) //if(div3(a[i]))

{

printf("%d\n",a[i]);

}

}

}

int main(int argc, char **argv)

{

int a[10]={0};

fill_array(a,10);

//find_num3(a,10);

find_num(a,10,div3);

return 0;

}

15.typedef关键字

取别名,给数据类型取别名

1.普通数据类型取别名

typedef 老的数据类型名 新的数据类型名

typedef unsigned char u8;

typedef unsigned short u16;

typedef char s8;

int main(int argc, char **argv)

{

u8 a; //unsigned char

u16 b; //unsigned short

s8 c; //char

return 0;

}

2.简化函数指针的写法

typedef int* (*PFUN)(int,int,char*);

int* func(int a,int b,char* c) // func的类型int* (*)(int ,int ,char* )

{

return NULL;

}

int func2(int a,int b,PFUN pfun)

{

char str[]={0};

pfun(1,2,str);

return 0;

}

3.和结构体有关
http://www.jsqmd.com/news/820671/

相关文章:

  • AI提示词注入绕过工具:一键绕过Codex/Claude安全限制,CTF夺旗与渗透测试必备神器
  • OpenClaw性能优化实战:网络I/O、解析处理与并发控制深度解析
  • 一键安装Cursor AI编辑器:Bash脚本自动化部署实践
  • 从Git历史到数据洞察:构建代码仓库统计分析工具的设计与实践
  • 枣庄 CPPM 证书费用 山东本地 CPPM 报考详解 - 中供国培
  • 基于Kubernetes的MLOps参考架构:从模型开发到生产部署的工程化实践
  • 基于大语言模型的Home Assistant智能体:自然语言控制与自动化代码生成
  • 终极指南:InfluxDB Studio - 让时间序列数据管理变得简单高效
  • Kubernetes配置质量守护者:kube-score静态分析与最佳实践
  • AI服务器CSA1-N8S1684深度评测:140.8Tops算力如何赋能大模型推理与部署
  • 事件监听 (@) 将两者连接起来
  • AI工程化迁移实践:从云端API到本地部署的架构演进
  • 如何快速解决城通网盘下载限速问题:ctfileGet完整使用指南
  • 基于WebSocket的企业微信AI助手部署与调优实战
  • Cursor Pro激活工具:一键破解专业版限制,实现无限AI编程体验
  • Python自动化抢票终极指南:告别手动刷新,大麦网演唱会票务自动化解决方案
  • 终极免费中文字体方案:Source Han Serif CN完全使用宝典
  • Vue 3 + TypeScript + Vite 企业官网实战:集成ChatGPT智能客服与性能优化
  • 深度掌握AMD Ryzen系统调试:SMUDebugTool终极使用指南
  • 2026年哑光砖公司品牌推荐:装修风格/⼯艺⾯瓷砖/陶瓷一线品牌/陶瓷十大品牌 - 品牌推广大师
  • 3分钟免费转换:PNG/JPG图片如何无损转为SVG矢量图?
  • TypeScript函数式编程实战:fp-ts生产级应用技巧与模式解析
  • 【Veo 2生成合规性红线预警】:GDPR/CCPA/中国AIGC新规下7类禁用指令与内容水印嵌入标准(含Google官方审核日志解读)
  • Go语言json-repair库:高效修复LLM输出的非标准JSON
  • 2026最新在线水印去除方法盘点|视频图片水印怎么免费清除?这些工具值得用
  • CircuitPython存储管理与硬件接口实战:安全擦除与board模块详解
  • 3分钟解锁WeMod高级功能:Wand-Enhancer完全指南,免费获得Pro体验
  • 收藏 | 小白程序员必看:如何利用AI工具提升核心竞争力,不被时代淘汰?
  • 5G与LTE-A并非替代关系:从技术本质、应用场景与商业现实看协同演进
  • Codmate:基于情境感知与事件驱动的开发者智能助手设计与实战