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

C语言深度复习【数组和指针】

目录

一.数组和指针

1.1 数组指针

1.2 指针数组

1.3 函数指针

1.4 const和指针

1.5 sizeof和指针和数组

1.6 strlen和字符数组


一.数组和指针

1.1 数组指针

  • 一个数组指针实际上是指指向数组的指针。当你有一个数组类型作为函数参数时,它在函数内部被当作一个指针来处理。
  • 例如,int (*pArray)[10] 声明了一个指向含有10个整数的数组的指针。
  • [ ] 的优先级要高于*号的,所以必须加上()来保证p先和*结合
  • 通常用于函数参数,以传递整个数组。由于数组在函数参数中退化为指针,返回数组的函数可以返回一个数组指针
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*pArray)[10] = &arr; // pArray是一个指向含有10个整数的数组的指针

1.2 指针数组

  • 一个指针数组是一个数组,其元素是指针。
  • 例如,int *pointerArray[5] 声明了一个包含5个指向整数的指针的数组
  • 当你需要一个可以动态改变其元素的数组时使用,每个元素可以独立地指向不同的数据或内存地址
int numbers[] = {0, 1, 2, 3, 4};
int *pointerArray[] = {&numbers[0], &numbers[1], &numbers[2], &numbers[3], &numbers[4]};

1.3 函数指针

return_type (*pointer_name)(parameter_list);
  • return_type 是函数返回值的数据类型。
  • pointer_name 是指针变量的名称。
  • parameter_list 是函数参数的列表,包括参数的类型和顺序。
#include<stdio.h>int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int main()
{int (*function_ptr)(int, int);// 声明一个函数指针function_ptr = add;//将函数指针指向 add 函数printf("%d\n", function_ptr(3, 5));// 通过函数指针调用 add 函数function_ptr = sub;printf("%d\n", function_ptr(3, 5));
}

1.4 const和指针

  • const type *ptr; 表示指针指向的数据是常量,但指针本身可以改变。
  • type *const ptr; 表示指针本身是常量,但可以通过指针修改数据。
  • const type *const ptr; 表示指针本身和指向的数据都是常量。
int main()
{const int num = 10;const int* ptr = &num;// *ptr = 20; // 错误:不能通过指向常量的指针修改数据int num2 = 10;int num3 = 20;int* const ptr1 = &num2;// ptr1 = &num3; // 错误:不能改变指针的值*ptr1 = 30; // 正确:可以通过指针修改数据const int num4 = 10;const int* const ptr2 = &num4;// ptr2 = &some_other_int; // 错误:不能改变指针的值// *ptr2 = 20; // 错误:不能通过指向常量的指针修改数据
}

1.5 sizeof和指针和数组

  • sizeof 对于数组返回整个数组的大小。
  • sizeof 对于指针返回指针本身的大小。
  • 对于指向数组的指针,sizeof 在编译时返回指针的大小,而在运行时返回数组的大小。
  • sizeof 对于指针数组返回整个指针数组的大小。
void func(int arr[10]) 
{printf("%zu\n", sizeof(arr)); // 这里输出的是指针的大小,不是数组的大小
}int main()
{int arr[10];printf("%zu\n", sizeof(arr)); // 输出整个数组的大小,这里是 10 个 int 的大小func(arr);int* p;printf("%zu\n", sizeof(p)); // 输出指针的大小,通常是 4 或 8 个字节int array[10];int(*ptr)[10] = &array;printf("%zu\n", sizeof(*ptr)); // 输出数组的大小printf("%zu\n", sizeof(ptr));  // 输出指针的大小int* arr1[10] ;printf("%zu\n", sizeof(arr1)); // 输出指针数组的大小
}

1.6 strlen和字符数组

size_t strlen(const char *str);

strlen 是 C 语言标准库函数,定义在 <string.h> 头文件中,用于计算一个以空字符 '\0' 结尾的字符串的长度。strlen 函数不计算终止的空字符。

当您有一个字符数组并且该数组存储了一个字符串时,您可以使用 strlen 来获取字符串的长度。

#include <stdio.h>
#include <string.h>int main() {char myString[] = "Hello, World!";size_t length = strlen(myString); // 计算字符串长度,不包括终止的 '\0'printf("长度为: %zu\n", length);return 0;
}

注意事项:

  • strlen 只能用于以空字符 '\0' 结尾的字符串。如果字符数组中没有空字符,strlen 可能会进入无限循环,因为它会尝试找到字符串的结束标志。
  • strlen 函数的时间复杂度是 O(n),其中 n 是字符串的长度,因为它需要逐个字符检查直到找到空字符。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 滚雪球学MyBatis-Plus(02):环境准备
  • python-word添加标题,段落,文字块
  • C++ 计算日期到天数转换(牛客网)
  • 基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统
  • Java throw和throws有什么区别?
  • 将工程内的组件 集成并发布到私有仓库以及后续联动运行(热启动)
  • Hibernate 批量插入速度慢的原因和解决方法
  • 六、Selenium操作指南(二)
  • JavaEE第19节 用UDP套接字实现简单回显服务器
  • JVM学习《类加载运行-jvm内存模型》
  • EXO:StandardNode _process_tensor
  • Node.js中的SQLite库:安装、对比与选择指南
  • Datawhale X 李宏毅苹果书 AI夏令营 进阶 Task2-自适应学习率+分类
  • 100423. 求出数字答案 显示英文描述
  • Makefile入门
  • Java,console输出实时的转向GUI textbox
  • PHP CLI应用的调试原理
  • Python实现BT种子转化为磁力链接【实战】
  • Travix是如何部署应用程序到Kubernetes上的
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 观察者模式实现非直接耦合
  • 如何实现 font-size 的响应式
  • 收藏好这篇,别再只说“数据劫持”了
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我建了一个叫Hello World的项目
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #QT(智能家居界面-界面切换)
  • (4)logging(日志模块)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)PySpark3:SparkSQL编程
  • (四)鸿鹄云架构一服务注册中心
  • (转) ns2/nam与nam实现相关的文件
  • (转)Google的Objective-C编码规范
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .gitignore文件使用
  • .NET C# 操作Neo4j图数据库
  • .Net Core和.Net Standard直观理解
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET MVC之AOP
  • .Net 代码性能 - (1)
  • .net 获取url的方法
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET大文件上传知识整理
  • .sh 的运行
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • [ANT] 项目中应用ANT
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰
  • [c]扫雷