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

C语言学习笔记(十二):一维字符数组传参与高级指针应用

一、一维字符数组与指针

1. 字符数组本质

在C语言中:

字符串本质上是:

以'\0'结尾的一维字符数组。

例如:

char str[]="hello";

内存结构:

h e l l o \0

数组名:

str

表示:

数组首元素的地址。

也就是:

&str[0]

二、一维字符数组传参

1. 数组作为函数参数

例如:

void print(char str[]) { }

实际上等价于:

void print(char *str) { }

原因:

数组传参时,数组名会退化为指针。


例如:

#include<stdio.h> void print(char *p) { printf("%s\n",p); } int main() { char str[]="hello"; print(str); return 0; }

输出:

hello

执行过程:

str数组 ↓ 首地址 ↓ 传递给指针p ↓ 访问字符串

三、利用指针计算字符串长度

C语言中的:

strlen()

作用:

计算字符串长度。

例如:

strlen("hello")

结果:

5

但是我们可以自己实现。


1. 使用数组下标方式

代码:

int mystrlen(char str[]) { int i=0; while(str[i]!='\0') { i++; } return i; }

执行过程:

str[0] str[1] str[2] ... 直到'\0'

2. 使用指针方式

代码:

int mystrlen(char *p) { int len=0; while(*p!='\0') { p++; len++; } return len; }

执行过程:

开始:

p → h

移动:

p++

直到:

p → '\0'

这种方式更加接近C语言底层实现。


四、字符串复制函数 mystrcpy

C语言库函数:

strcpy()

作用:

将一个字符串复制到另一个字符数组。

例如:

char a[20]; char b[]="hello"; strcpy(a,b);

结果:

a="hello"

自己实现:

void mystrcpy(char *dest,char *src) { while(*src!='\0') { *dest=*src; dest++; src++; } *dest='\0'; }

执行过程:

源字符串:

src h e l l o \0

目标:

dest _ _ _ _ _

逐个复制:

h e l l o \0

五、字符串连接函数 mystrcat

C语言:

strcat()

作用:

连接两个字符串。

例如:

hello + world

结果:

helloworld

实现思路:

  1. 找到目标字符串末尾;

  2. 从末尾开始复制第二个字符串。

代码:

void mystrcat(char *dest,char *src) { while(*dest!='\0') { dest++; } while(*src!='\0') { *dest=*src; dest++; src++; } *dest='\0'; }

六、字符串比较函数 mystrcmp

C语言:

strcmp()

用于比较两个字符串。

比较规则:

按照字符ASCII码比较。

例如:

abc abd

比较:

a=a b=b c<d

所以:

abc < abd

实现:

int mystrcmp(char *s1,char *s2) { while(*s1==*s2) { if(*s1=='\0') return 0; s1++; s2++; } return *s1-*s2; }

返回结果:

  • 0:相等

  • 大于0:s1大

  • 小于0:s1小


七、字符串倒置

字符串倒置:

例如:

原字符串:

hello

变成:

olleh

实现思路:

使用两个指针:

start end ↓ ↓ h e l l o

交换:

h ↔ o e ↔ l

代码:

void reverse(char *str) { char temp; char *start=str; char *end=str; while(*end!='\0') { end++; } end--; while(start<end) { temp=*start; *start=*end; *end=temp; start++; end--; } }

八、指针函数

1. 什么是指针函数?

指针函数:

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

例如:

int *fun(int x,int y);

表示:

函数返回:

int *

类型。


示例:

int *fun() { static int a=10; return &a; }

调用:

int *p; p=fun();

注意:

函数:

不能返回局部变量地址。

错误:

int *fun() { int a=10; return &a; }

原因:

函数结束后:

局部变量空间被释放。

指针会变成野指针。


九、函数指针

1. 什么是函数指针?

函数指针:

指针指向一个函数。

例如:

int (*p)(int,int);

表示:

p是一个指向函数的指针。


普通指针:

指向变量

函数指针:

指向函数

2. 函数指针使用

例如:

定义函数:

int add(int a,int b) { return a+b; }

定义函数指针:

int (*p)(int,int);

让p指向add:

p=add;

调用:

p(10,20);

等价:

add(10,20);

十、指针函数和函数指针区别

类型含义
指针函数函数返回指针
函数指针指针指向函数

简单理解:

指针函数: 函数 → 返回指针 函数指针: 指针 → 指向函数

十一、const修饰指针

const:

含义:

readonly(只读)

表示不能修改。


1. const int *p

等价:

int const *p;

例如:

const int *p;

表示:

p可以改变

例如:

p=&b;

允许。

不能通过p修改数据

错误:

*p=100;

总结:

指针可变 数据不可变

2. int *const p

表示:

指针本身不可改变。

例如:

int *const p=&a;

允许:

*p=100;

不允许:

p=&b;

总结:

指针不可变 数据可变

3. const int *const p

表示:

指针和数据都不能改变。

例如:

const int *const p=&a;

特点:

不能:

p=&b;

也不能:

*p=100;

总结:

指针不可变 数据不可变

十二、const指针总结表

定义指针数据
const int *p可变不可变
int const *p可变不可变
int *const p不可变可变
const int *const p不可变不可变
http://www.jsqmd.com/news/1311272/

相关文章:

  • 2026这6款硬核降AI率网站全揭秘,一键把AI检测率精准控到安全区!
  • 猫抓Cat-Catch终极实战:高效浏览器资源嗅探架构深度解析
  • MFC树控件节点删除实战:HTREEITEM机制与内存泄漏防范
  • 2026 年现阶段北票有实力的门墩抱鼓石源头厂家哪家靠谱,老北京门口压了几百年的石疙瘩,藏着你不知道的真讲究? - 企业推荐官【认证官方】
  • 从BLG战队冲突看技术团队管理:情绪劳动、压力传导与冲突解决
  • 220V交流电PCB设计:安规距离、布局布线与EMC防护实战指南
  • PCIe配置空间与ECAM机制详解:从硬件拓扑到UEFI枚举实战
  • VASP电子局域函数(ELF)计算与可视化:从原理到实战
  • 2026年8月贵州发泡混凝土工程/发泡混凝土工程厂家怎么选_贵州恒远建筑节能工程有限公司 - 品牌宣传支持者
  • [BJDCTF2020]Easy MD5-学习笔记
  • 华为MetaERP 在 EBS 实施里经常被混着用,但它们根本不是一个层面的概念——一个是“段位/业务维度“,一个是“打在段上的系统标签“。下面把边界、联系、配置关系一次讲透。一、概念边界:段位 v
  • 多光谱成像技术:从原理到实战,解析超越人眼的感知革命
  • AI工具链优化VR延迟:Unity+Ollama+WebGPU实现11.3ms响应
  • AI指令操作浏览器:自然语言转自动化任务实践
  • 从GLM-5.3社区呼声看视觉语言模型(VLM)的核心需求与技术挑战
  • 2026 年至今,富阳专业的工地临时住房定制厂家哪家好,住了五年的它居然能这么省钱?多数打工人都不知道的隐蔽福利 - 企业推荐官【认证官方】
  • 电竞数据分析实战:从赛事数据抓取到自动化报告生成
  • 2026年四川单招面试培训学校怎么选?正规机构筛选指南 - 优质品牌商家
  • 2026年四川耐用拦污栅厂家怎么选?这几家值得推荐! - 优质品牌商家
  • 别再靠猜了:给 Cloudflare Worker 加上日志,问题一眼就知道
  • 云盘目录树导出教程:生成 PDF、Excel 和图片清单
  • 排卵后黄体酮偏低,医生让打针但我怕副作用——欧聪维辅酶Q10调理黄体功能和药物补充的底层区别
  • 2026年8月污水排水管/贵州混凝土排水管厂家怎么选_贵州盛虹管业科技有限公司 - 品牌宣传支持者
  • 大语言模型评估陷阱:为何追求准确性反而催生幻觉?
  • Git 常用命令完整手册
  • 贝叶斯神经网络实战:从原理到PyTorch实现不确定性量化
  • 谷歌用AI“接管“Chrome安全防线:一个月修的漏洞比过去两年还多
  • 2026 年现阶段桥东专业的工地围挡厂家推荐,你工地旁的这圈“墙”,竟藏着关乎市容与安全的大秘密?-文洲金属制品 - 品质体验官
  • 2026年|谷歌推广相关口碑优质外贸独立站建站公司深度测评
  • 2026年重庆婚礼服定制厂家怎么选?本地高口碑企业推荐与行业观察 - 优质品牌商家