寒假每日提升(1)[适合复习使用]

不傲才以骄人,不以宠而作威。 ——诸葛亮


细节知识点

  • 数组
    • 1、相关数组“+1”的使用
    • 2、数组传参
    • 3、理解数组传参细节,使用malloc创建二维数组

数组

1、相关数组“+1”的使用

值得一提的是对于**+1**的使用,可能会有所不同。

#include
int main()
{
	char s[] = { '1','1','1','1','5' };
	printf("%c\n",*s);
	printf("%c\n",*s+1);
	printf("%c\n", *(s + 1));
	return 0;
}

寒假每日提升(1)[适合复习使用]_第1张图片
寒假每日提升(1)[适合复习使用]_第2张图片
在其中重要的是,&s+1和s+1的区别,相对于*s+1来说,更难理解,对于 *s+1来说的话,由于 *的优先级是高于+的,所以,先是应该解引用第一位的字符,然后得到之后再加上1的值,所以才会在后头显示的是2。而对于s+1应该就是字符数组的第一位加上1,到第二位置。而对于&s+1是跳过整个的字符数组到下一个区域,充分理解,也就是相当于可以将此运用到二维数组的使用传参。

2、数组传参

关于数组传参的问题,需要以下几点关注
1、函数的形式要和函数的实参个数相匹配
2、函数的实参是数组,形参也可以写成数组
3、形参如果是以为数组,数组的大小可以省略不写

就例如这样子

void fun(int a[]);

4、形参如果是二维数组的话,行可以省略,但是列不行
5、数组传参,形参不会创建新的数组
6、数组操作的和实参是同一个数组(并不是意味着形参指向的改变会改变实参的指向位置)

那么就会有一个好问题,请看!
已知数组D的定义是 int D[4][8]; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是【多选】( )
A: int D[4][] B: int *s[8] C: int(*s)[8] D: int D[][8]

答案:C,D
解析:由于之前的关注说明行可以省略,但是列不可以,所以A不对。由于B是指针数组,可以看之前的文章,这里讲述了指针数组和数组指针这就不再赘叙,很显然B是错的。那C为什么是对的呢?首先是因为是数组指针,对应的是存放数组的指针,并且数组还是8个元素的。并且在此时的情况之下,(s+1)或者是s[1]也就是代表的第二行的数组。对于D来说,很明显是正确的。
相比如此,也差不多很明白的知道了数组传参,以及二维数组的传参的细节了

3、理解数组传参细节,使用malloc创建二维数组

对于malloc来说,在官网的定义是这样的。
寒假每日提升(1)[适合复习使用]_第3张图片
也就是void类型,所以在这样的基础之上,我们可以理解上一部分的数组指针,利用其特点,创造出二维数组,具体请看下面代码。

#include 
#include 
int main() {
    int m = 3; // 三行
    int n = 4; // 四列

    // 使用 malloc 分配内存
    int** matrix = (int**)malloc(m * sizeof(int*));
    for (int i = 0; i < m; ++i) {
        matrix[i] = (int*)malloc(n * sizeof(int));
    }
    // 初始化二维数组
    int count = 1;
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            matrix[i][j] = count++;
        }
    }
    // 打印二维数组
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            printf("%2d ", matrix[i][j]);
        }
        printf("\n");
    }
    // 释放内存
    for (int i = 0; i < m; ++i) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

需要关注的是malloc的区域,在结束之记得释放掉。

你可能感兴趣的:(寒假每日,算法)