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

关于C语言的杂记5

文章目录

  • 引入
  • 正文
    • 内部函数与外部函数
    • 相关数组的知识点
      • 数组的初始化
      • 测试一维数组在内存中存储的地址:
      • 遍历二维数组的值
      • 测试二维数组的地址(观察内存情况)
      • 数组下标为0开始的由来
    • 两个数交换位置的三种方法

引入

写在前面:关于C语言这部分内容,有人说过,对自己的定位准确非常重要,我是小白。我正处于C语言知识积累阶段,并写不出成系统的知识供大家观看,而各个知识点内容都载自或者加工于网络上面优秀的博主,如果你觉好看,那一定这些博主的功劳,而我仅仅是根据自己的知识结构进行记录、和按照突然想到方式进行测试,然后把涉及不会的知识查找着补充进来,以便后面复习,其中不免有很多错误之处,如果你能指出了那最好不过,如果观看请一定带着批判角度去看。

正文

内部函数与外部函数

总结
内部函数:被static修饰的是内部函数,内部函数只能被本文件中其他函数调用,不能被其他文本的函数调用。
外部函数:被extern修饰的是外部函数,外部函数范围大,不仅可以被本文的其他函数调用,还可以被其他文本的函数调用;
C语言中规定,extren可以省略,但是在调用此函数的其他文件中,需要对此函数进行声明


点击跳转原文优秀博主bleauchat链接


相关数组的知识点

数组的初始化

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};//完全初始化
char arr4[] = {'a',98,'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

数组在创建得时候如果想不指定数组得确定的大小就得初始化。数组得元素个数根据初始化得内容来确定。但是对于下面得代码要区分,内存中如何分配?


#include <stdio.h>
#include <string.h>int main(int argc, char **argv) {char arr1[] = "abc"; // 定义一个字符型数组,自动分配3个空间并赋值为"abc"char arr2[3] = {'a','b','c'}; // 定义一个字符型数组,手动分配3个空间并赋值为'a'、'b'、'c'printf("%d\n", sizeof(arr1)); // 输出arr1数组的大小,为4(包括末尾的'\0')printf("%d\n", sizeof(arr2)); // 输出arr2数组的大小,为3printf("%d\n", strlen(arr1)); // 输出arr1字符串的长度,为3(不包括末尾的'\0')printf("%d\n", strlen(arr2)); // 输出arr2字符串的长度,长度不定(因为不一定有'\0')
} 

对于printf(“%d\n”, strlen(arr2));也就是13行代码,两个编译器都有不同的值。
dev C++5.6.3
在这里插入图片描述
C(lang)在线工具点击蓝色跳转C(lang)在线工具

在这里插入图片描述

解释如下:
arr1 ----> a b c \0 ---->4个字节(sizeof)
arr2 ----> a b c ---->3个字节(sizeof)
arr1 ----> a b c \0 ---->3个字节(strlen)
arr2 ----> a b c ----> 随机值(strlen)因为后面遇到\0是随机的,不确定的
1、strlen 和 sizeof 没有什么关联
2、strlen 是求字符串长度的 - 只能针对字符串求长度 - 库函数 - 使用得引用头文件
3sizeof 计算变量、数组、类型得大小 - 单位是字节 -操作符
//注解:在没有引用头文件"   #include <string.h>  "双引号内的代码时,strlen会报错,而sizeof无需依赖其他头文件,只要有输入输出函数"   #include <stdio.h>  "就可以输出。

在这里插入图片描述
在这里插入图片描述

测试一维数组在内存中存储的地址:

#include <stdio.h>
int main() {int arr[10] = { 0 };int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) {printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}

注意:%p表示用户希望计算机显示的值是以数组的地址的方式输出的。
测试结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/e2762ad5183b4510b9e686c3b3b80aeb.png

测试结论:数组在内存中是连续存放的
在这里插入图片描述

遍历二维数组的值

#include <stdio.h>
int main(){//定义一个3行4列的二维数组,并初始化前两行int arr[3][4] = {{1,2},{4,5}};int i = 0;//循环3次,遍历每一行for(i=0; i<3; i++){int j = 0;//循环4次,遍历该行的每一个元素,并打印出该元素的值for(j=0; j<4; j++){printf("%d ", arr[i][j]);}}return 0;
}

在这里插入图片描述

测试二维数组的地址(观察内存情况)

#include <stdio.h>
int main(){   int arr[3][4]; // 定义一个3行4列的整型数组int i = 0;    for(i=0; i<3; i++) // 遍历每一行{int j = 0; for (j = 0; j < 4; j++) // 遍历每一列{ printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); // 输出当前元素的地址}}   return 0; 
} 

在这里插入图片描述
结论:二维数组也在内存中的存储情况是连续的。

数组下标为0开始的由来

在这里插入图片描述

两个数交换位置的三种方法

//1temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;//2arr[j] = arr[j] * arr[j + 1];arr[j + 1] = arr[j] / arr[j + 1];arr[j] = arr[j] / arr[j + 1];//3arr[j] = arr[j] + arr[j + 1];arr[j + 1] = arr[j] - arr[j + 1];arr[j] = arr[j] - arr[j + 1];
http://www.lryc.cn/news/70190.html

相关文章:

  • YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究
  • 如何增加网站权重?有效提高网站权重的技巧方法
  • 路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)
  • 【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI
  • Python篇——数据结构与算法(第二部分)
  • 人工智能之读懂CNN卷积神经网络
  • go手写Redis(1)之协议说明
  • Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?
  • 羽毛球中级提高班课后总结
  • 多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测
  • KDZK-F水轮发电机转子测试仪
  • I2C通信协议原理和MPU6050
  • 3.5 RDD持久化机制
  • Nginx(四)
  • 【fps系统重构】-观察cpu、memroy、io -iostat
  • iptables 添加,删除,查看,修改,及docker运行时修改端口
  • Liunx安装Android Studio
  • 8、Linux C/C++ 实现MySQL的图片插入以及图片的读取
  • 【搭建轻量级图床】本地搭建LightPicture开源图床管理系统 - 异地远程访问
  • 微信小程序全局路由拦截
  • 截图自动添加水印(macOS/windows)
  • 大学四年,我建议你这么学网络安全
  • Spring Boot整合Redis缓存并使用注解
  • 通知可以根据切入点表达式来进行增强,也可以根据自己的注解值来进行增强
  • <Python实际应用>做一个简单的签到投屏系统
  • 时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测
  • Baumer工业相机堡盟工业相机使用BGAPISDK将工业相机设为Burst模式以及该模式的优势以及行业应用(C++)
  • BERT输入以及权重矩阵形状解析
  • 3 个令人惊艳的 ChatGPT 项目,开源了!
  • 一、12.C++内存管理