C语言数组和函数

简介: C语言数组和函数

一、数组

1、一维数组

#include <stdio.h>
int main() {
    //int arr[5];  //数组声明语句,数组里包含5个整数类型的存储区
    //int arr[5] = {1, 2, 3, 4, 5};   //数组初始化的方法
    //int arr[5] = {1, 2, 3, 4, 5, 6, 7};   //没有对应存储区的初始化数据自动被忽略
    //int arr[5] = {1, 2, 3};  //没有对应初始化数据的存储区会自动被初始化成0
    int arr[] = {1, 2, 3, 4, 5};  //如果初始化数组时省略了数组里包含的存储区个数则存储区个数就是初始化数据的个数
    int num = 0;
    //arr[2/*有效下标*/] /*代表数组里下标为2的存储区*/ = 10;
    /*for (num = 0;num <= 4;num++) {
        arr[num] = num;
    }*/
    for (num = 4;num >= 0;num--) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    int arr[5] = {0};
    //数组名称代表数组里第一个存储区的地址
    printf("arr是%p\n", arr);
    printf("&arr[0]是%p\n", &arr[0]);
    printf("sizeof(arr)是%d\n", sizeof(arr));  //对数组名称进行sizeof计算的结果是数组里所有存储区的总大小    
    return 0;
}


2、一维数组练习

#include <stdio.h>
int main() {
    int arr[5] = {0};
    int val = 0, num = 0;
    printf("请输入一个数字:");
    scanf("%d", &val);
    for (num = 4;num >= 0;num--) {
        //从后向前往每个存储区里
        //存放拆出来的一个数位内容
        arr[num] = val % 10;   //得到最右边数位内容并记录到循环变量做下标的存储区里
        val /= 10;    //丢掉最右边数位
        if (!val) {
            //处理不需要继续循环的情况
            break;
        }
    }
    //把数组里记录的每个数位内容显示在
    //屏幕上
    //num代表最左边的数位内容所在的存储区下标
    for (num = num;num <= 4;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}


3、二维数组声明

#include <stdio.h>
int main() {
    int arr[3/*分组个数*/][2/*分组里的存储区个数*/];   //二维数组声明
    int row = 0, col = 0, cnt = 1;
    arr[1/*有效的组下标*/][0/*有效的组内下标*/] = 10;
    for (row = 0;row <= 2;row++) {  //循环变量代表所有组下标
        for (col = 0;col <= 1;col++) {  //循环变量代表所有组内下标
            arr[row][col] = cnt;
            cnt++;
        }
    }
    return 0;
}


4、二维数组初始化

#include <stdio.h>
int main() {
    //int arr[3][2] = {1, 2, 3, 4, 5, 6};  //把二维数组当做一维数组进行初始化
    //int arr[3][2] = {{1, 2}, {3}, {5, 6}};  //把初始化数据进行分组,每组初始化数据用来初始化一组存储区
    //int arr[][2] = {1, 2, 3, 4, 5};   //5个初始化数据至少需要3组存储区,如果省略数组声明里的分组个数则计算机就会分配三组存储区
    int arr[][2] = {{1}, {2}, {3}};  //初始化数据分为三组,如果省略数组声明里的分组个数则计算机也会分配三组存储区
    int row = 0, col = 0;
    for (row = 0;row <= 2;row++) {
        for (col = 0;col <= 1;col++) {
            printf("%d ", arr[row][col]);
        }
        printf("\n");
    }
    return 0;
}


5、二维数组组名

#include <stdio.h>
int main() {
    int arr[3][2] = {0};
    printf("arr是%p\n", arr);   //二维数组名称可以代表数组里第一个存储区的地址
    printf("&arr[0][0]是%p\n", &arr[0][0]);
    printf("sizeof(arr)是%d\n", sizeof(arr));  //对二维数组名称进行sizeof计算结果是二维数组里所有存储区的总大小
    printf("arr[1]是%p\n", arr[1/*组下标*/]/*代表组下标为1的组里最前面那个存储区的地址*/);
    printf("&arr[1][0]是%p\n", &arr[1][0]);
    printf("sizeof(arr[1])是%d\n", sizeof(arr[1]));   //结果是一组存储区的总大小
    return 0;
}
运行结果:
arr是007DF830
&arr[0][0]是007DF830
sizeof(arr)是24
arr[1]是007DF838
&arr[1][0]是007DF838
sizeof(arr[1])是8


6、二维数组练习

#include <stdio.h>
int main() {
    int arr[5][5] = {0};
    int row = 0, col = 0;
    for (row = 0;row <= 4;row++) {
        for (col = 0;col <= 4;col++) {
            //按顺序处理二维数组里的每个存储区
            if (row == 0 && col < 4) {
                //组下标为0,组内下标小于4的
                //存储区里应该放1
                arr[row][col] = 1;
            }
            else if (row < 4 && col == 4) {
                //组下标小于4,组内下标等于4
                //的存储区里应该放2
                arr[row][col] = 2;
            }
            else if (row == 4 && col >= 1) {
                //组下标是4,组内下标大于等于1
                //的存储区里应该放3
                arr[row][col] = 3;
            }
            else if (row >= 1 && col == 0) {
                //组下标大于等于1,组内下标是0
                //的存储区里应该放4
                arr[row][col] = 4;
            }
        }
    }
    //把二维数组里所有存储区的内容从前向后
    //每组显示在一行里
    for (row = 0;row <= 4;row++) {
        for (col = 0;col <= 4;col++) {
            printf("%d", arr[row][col]);
        }
        printf("\n");
    }
    return 0;
}
运行结果:
11112
40002
40002
40002
43333


二、函数

1、普通函数

#include <stdio.h>
void func(void) {
    int val = 100;   //不同函数里的变量可以重名
}
int main() {
    int val = 10;    //不同函数里的变量可以重名
    printf("val是%d\n", val);  //不可以使用其他函数里的变量
    return 0;
}


2、带返回值函数

#include <stdio.h>
void func(void) {
    int val = 100;   //不同函数里的变量可以重名
}
int main() {
    int val = 10;    //不同函数里的变量可以重名
    printf("val是%d\n", val);  //不可以使用其他函数里的变量
    return 0;
}


3、带参数函数

#include <stdio.h>
void print(int val/*形式参数*/) {
    printf("数字是%d\n", val);
}
int main() {
    print(7/*实际参数*/);  //函数调用的时候计算机会把7放在形式参数val的存储区里
    print(5 + 3);
    return 0;
}
#include <stdio.h>
int add(int val, int val1) {  //每个形式参数的类型名称都不可以省略
    return val + val1;
}
int main() {
    int val = add(6, 3);
    printf("求和结果是%d\n", val);
    return 0;
}
#include <stdio.h>
void func(int val, int val1) {
    printf("%d X %d = %d\n", val, val1, val * val1);
}
int main() {
    /*func(1, 9);
    func(2, 8);
    func(3, 7);
    func(4, 6);
    func(5, 5);*/
    int num = 0;
    for (num = 1;num <= 5;num++) {
        func(num, 10 - num);
    }
    return 0;
}
运行结果:
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25


4、鸡兔同笼问题

#include <stdio.h>
int rabbit(int heads, int legs) {
    int num = 0;
    for (num = 0;num <= heads;num++) {
        if (4 * num + 2 * (heads - num) == legs) {
            return num;
        }
    }
    return -1;
}
int main() {
    int heads = 0, legs = 0, ret = 0;;
    printf("请输入头和脚的数量:");
    scanf("%d%d", &heads, &legs);
    ret = rabbit(heads, legs);
    if (ret >= 0) {
        printf("兔子是%d只,鸡有%d只\n", ret, heads - ret);
    }
    else {
        printf("没有找到答案\n");
    }
    return 0;
}


5、数组做函数参数

#include <stdio.h>
void print(int arr[], int size) {
    int num = 0;
    for (num = 0;num <= size - 1;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    print(arr, 5);    //和数组形式参数配对的实际参数必须是一个地址
    return 0;
}


6、输入输出参数

#include <stdio.h>
void neg(int arr[], int size) {
    int num = 0;
    for (num = 0;num <= size - 1;num++) {
        arr[num] = 0 - arr[num];
    }
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int num = 0;
    neg(arr, 5);
    for (num = 0;num <= 4;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}


7、函数声明

#include <stdio.h>
double add(double , double );//定义的函数在后面,前面用到了就需要声明一下
int main() {
    int val = add(3, 8);
    printf("val是%d\n", val);
    return 0;
}
double add(double val, double val1) {
    return val + val1;
}


8、exit()退出函数

#include <stdio.h>
#include <stdlib.h>
void func(void) {
    printf("2\n");
    //return ;//退出该函数
    exit(0);//结束程序
    printf("3\n");
}
int main() {
    printf("1\n");
    func();
    printf("4\n");
    return 0;
}

9、递归函数()

#include <stdio.h>
void print(int max) {
    if (max == 1) {
        //处理最大数字是1的情况
        //这种情况不能再分解了
        printf("1 ");
        return ;  //分支必须保证函数可以结束
    }
    print(max - 1);   //显示1到max - 1之间所有整数,采用递归调用语句实现的
    printf("%d ", max);
}
int main() {
    int max = 0;
    printf("请输入最大数字:");
    scanf("%d", &max);
    print(max);
    printf("\n");
    return 0;
}
运行结果:
请输入最大数字:8
1 2 3 4 5 6 7 8


#include <stdio.h>
int fei(int sn) {
    if (sn <= 1) {
        //计算编号为0和编号为1的两个数字
        return 1;
    }
    return fei(sn - 2)/*计算编号为sn - 2的数字*/ + fei(sn - 1)/*计算编号为sn - 1的数字*/;
}
int main() {
    int sn = 0;
    printf("请输入一个编号:");
    scanf("%d", &sn);
    printf("结果是%d\n", fei(sn));
    return 0;
}
目录
相关文章
|
18天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
30 3
|
9天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
28 10
|
2天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
8天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
32 7
|
8天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
22 4
|
9天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
24 6
|
13天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
13天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
16天前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
5天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
9 0