文章目录
- 引入
- 正文
- 内部函数与外部函数
- 相关数组的知识点
- 数组的初始化
- 测试一维数组在内存中存储的地址:
- 遍历二维数组的值
- 测试二维数组的地址(观察内存情况)
- 数组下标为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数组的大小,为3
printf("%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 是求字符串长度的 - 只能针对字符串求长度 - 库函数 - 使用得引用头文件
3、sizeof 计算变量、数组、类型得大小 - 单位是字节 -操作符
//注解:在没有引用头文件" #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表示用户希望计算机显示的值是以数组的地址的方式输出的。
测试结果
测试结论:数组在内存中是连续存放的
遍历二维数组的值
#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开始的由来
两个数交换位置的三种方法
//1
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
//2
arr[j] = arr[j] * arr[j + 1];
arr[j + 1] = arr[j] / arr[j + 1];
arr[j] = arr[j] / arr[j + 1];
//3
arr[j] = arr[j] + arr[j + 1];
arr[j + 1] = arr[j] - arr[j + 1];
arr[j] = arr[j] - arr[j + 1];