关于C语言的杂记5

news/2024/11/9 0:34:14/

文章目录

  • 引入
  • 正文
    • 内部函数与外部函数
    • 相关数组的知识点
      • 数组的初始化
      • 测试一维数组在内存中存储的地址:
      • 遍历二维数组的值
      • 测试二维数组的地址(观察内存情况)
      • 数组下标为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.ppmy.cn/news/77107.html

相关文章

[答疑]UML精粹里和你视频里说的不太一样

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 第五元素 2023-4-14 20:32 这是是UML精粹里的。潘老师&#xff0c;这个跟你视频里讲的是不是不太一样&#xff1f;还是我理解错了&#xff1f; UMLChina潘加宇 这个&#…

CRM客户管理系统开发 获客管理营销全搞定

企业经营管理是有很大学问的&#xff0c;无论是生产经营、销售、服务还是客户管理、维护、营销都是需要付出一定的人力物力来管理的。传统的企业管理多是通过人工方式来完成&#xff0c;个中细节繁琐复杂&#xff0c;耗时耗力还很容易出现纰漏。所以随着科技的发展&#xff0c;…

QDir拼接路径解决各种斜杠问题

一般在项目中经常需要组合路径,与其他程序进行相互调用传递消息通信。 经常可能因为多加斜杠、少加斜杠等问题导致很多问题。 为了解决这些问题,我们可以使用QDir来完成路径的拼接,不直接拼接字符串。 QDir的静态方法QDir::cleanPath() 是为了规范化路径名的,在使用QDir组…

pthread多线程: 线程泄漏的检测

文章目录 1. 目的2. 什么是线程泄漏3. pthread 线程泄漏例子3.1 代码3.2 编译和运行3.3 简要分析 4. 检测线程泄漏4.1 编译链接时传入参数 -fsanitizethread4.2 确认 TSAN_OPTIONS 环境变量 5. 修复线程泄漏5.1 方法1&#xff1a; 主线程等待子线程5.2 方法2&#xff1a;子线程…

SSRF-服务器端请求伪造

漏洞定义和成因 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它…

6. python的for循环

文章目录 一、for循环1.1、for循环分析1.2、注意事项 二、遍历数值列表2.1、range()函数的使用2.2、 创建数值列表2.3、对数值列表进行简单统计 一、for循环 有时&#xff0c;我们需要对列表内的所有元素逐一进行相同的操作&#xff0c;为避免出现大量重复的代码&#xff0c;p…

day9 - 对花朵图像进行边缘检测

本期主要介绍常用于进行图像边缘检测的滤波器&#xff08;算子&#xff09;&#xff1a;Sobel算子、Scharr算子、Laplacian算子&#xff1b;通过实验比较不同的算子的处理效果以及使用场景。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像梯度的原理和应用 掌握使用S…

NTM中attr的用法

代码1 attrs class CopyTaskParams(object):name attrib(default"copy-task")controller_size attrib(default100, convertint)controller_layers attrib(default1,convertint)num_heads attrib(default1, convertint)sequence_width attrib(default8, convert…