C语言基础(五)—— 数组、数组地址(步长+1)、字符串输入输出、随机数

news2025/1/16 9:06:26

1. 概述

在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。

数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。

数组属于构造数据类型

  • 一个数组可以分解为多个数组元素:这些数组元素可以是基本数据类型或构造类型。

int a[10];  
struct Stu boy[10];
  • 按数组元素类型的不同,数组可分为:数值数组、字符数组、指针数组、结构数组等类别。

int a[10];
char s[10];
char *p[10];
struct Stu boy[10];

通常情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将二维及以上的数组称为多维数组

2. 一维数组

2.1 一维数组的定义和使用

  • 数组名字符合标识符的书写规定(数字、英文字母、下划线)

  • 数组名不能与其它变量名相同,同一作用域内是唯一的

  • 方括号[]中常量表达式表示数组元素的个数

int a[3]表示数组a有3个元素
其下标从0开始计算,因此3个元素分别为a[0],a[1],a[2]
  • 定义数组时[]内最好是常量使用数组时[]内即可是常量,也可以是变量

#include <stdio.h>

int main()
{
    int a[10];//定义了一个数组,名字叫a,有10个成员,每个成员都是int类型
    //a[0]…… a[9],没有a[10]
    //没有a这个变量,a是数组的名字,但不是变量名,它是常量
    a[0] = 0;
    //……
    a[9] = 9;

    int i = 0;
    for (i = 0; i < 10; i++)
    {
        a[i] = i; //给数组赋值
    }

    //遍历数组,并输出每个成员的值
    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

2.2 一维数组的初始化

在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为零局部数组若不初始化,内容为随机值

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量
int a[10] = { 1, 2, 3 };//初始化前三个成员,后面所有元素都设置为0
int a[10] = { 0 };//所有的成员都设置为0
    
//[]中不定义元素个数,定义时必须初始化
int a[] = { 1, 2, 3, 4, 5 };//定义了一个数组,有5个成员

2.3 数组名和数组地址

数组名是一个地址的常量代表数组中首元素的地址

#include <stdio.h>

int main()
{
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量

    printf("a = %p\n", a);
    printf("&a[0] = %p\n", &a[0]);

    int n = sizeof(a); //数组占用内存的大小,10个int类型,10 * 4  = 40
    int n0 = sizeof(a[0]);//数组第0个元素占用内存大小,第0个元素为int,4

    int i = 0;
    //数组长度:sizeof(a) / sizeof(a[0])
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}
int a[10]
数组名a ,等价于第0个元素的地址( 首元素地址)
数组名是常量,不能被赋值
&a[0] 第0个元素的地址
&a 整个数组地址

在数值上,&a[0],a,&a 相等。&a + 1,整个数组地址加1,跨过一个数组。

2.4 一维数组的最值(求最大或最小)

#include <stdio.h>

int main()
{
    int a[] = {  1, -2, 3,- 4, 5, -6, 7, -8, -9, 10 };//定义一个数组,同时初始化所有成员变量

    int i = 0;
    int max = a[0];
    for (i = 1; i < sizeof(a) / sizeof(a[0]); i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }
    printf("数组中最大值为:%d\n", max);

    return 0;
}

2.5 一维数组的逆置(翻转数组值)

#include <stdio.h>

int main()
{
    int a[] = {  1, -2, 3,- 4, 5, -6, 7, -8, -9, 10 };//定义一个数组,同时初始化所有成员变量

    int i = 0;
    int j = sizeof(a) / sizeof(a[0]) -1;
    int tmp;

    while (i < j)
    {
        tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
    }

    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("%d ", a[i]); //打印翻转后的值
    }
    printf("\n");

    return 0;
}

2.6 冒泡法排序

#include <stdio.h>

int main()
{
    int a[] = { 2, 5, 3, 7, -1 };//定义一个数组,同时初始化所有成员变量

    int i = 0;
    int j = 0;
    int n = sizeof(a) / sizeof(a[0]); //数组长度
    int tmp;

    //1、流程
    //2、试数
    for (i = 0; i < n-1; i++)
    {
        for (j = 0; j < n - i -1 ; j++)//内循环的目的是比较相邻的元素,把大的放到后面
        {
            if (a[j]  > a[j + 1])
            {
                tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
            }
        }
    }

    for (i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

3. 二维数组

3.1 二维数组的定义和使用

二维数组定义的一般形式是:

类型说明符 数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。

例如:

int a[3][4];

  • 命名规则同一维数组

  • 定义了一个三行四列的数组,数组名为a其元素类型为整型,该数组的元素个数为3×4个,即:

二维数组a是按行进行存放的,先存放a[0]行,再存放a[1]行、a[2]行,并且每行有四个元素,也是依次存放的。

  • 二维数组在概念上是二维的:其下标在两个方向上变化,对其访问一般需要两个下标。

  • 内存中并不存在二维数组,二维数组实际的硬件存储器是连续编址的,也就是说内存中只有一维数组,即放完一行之后顺次放入第二行,和一维数组存放方式是一样的。

#include <stdio.h>

int main()
{
    //定义了一个二维数组,名字叫a
    //由3个一维数组组成,这个一维数组是int [4]
    //这3个一维数组的数组名分别为a[0],a[1],a[2]
    int a[3][4];

    a[0][0] = 0;
    //……
    a[2][3] = 12;

    //给数组每个元素赋值
    int i = 0;
    int j = 0;
    int num = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            a[i][j] = num++;
        }
    }

    //遍历数组,并输出每个成员的值
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%d, ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

3.2 二维数组的初始化

//分段赋值     int a[3][4] = {{ 1, 2, 3, 4 },{ 5, 6, 7, 8, },{ 9, 10, 11, 12 }};
    int a[3][4] = 
    { 
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8, },
        { 9, 10, 11, 12 }
    };

    //连续赋值
    int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12  };

    //可以只给部分元素赋初值,未初始化则为0
    int a[3][4] = { 1, 2, 3, 4  };

    //所有的成员都设置为0
    int a[3][4] = {0};

    //[]中不定义元素个数,定义时必须初始化
    int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8};

3.3 二维数组名和数组地址

数组名是一个地址的常量代表数组中首元素的地址

#include <stdio.h>

int main()
{
    //定义了一个二维数组,名字叫a
    //二维数组是本质上还是一维数组,此一维数组有3个元素
    //每个元素又是一个一维数组int[4]
    int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12  };

    //数组名为数组首元素地址,二维数组的第0个元素为一维数组
    //第0个一维数组的数组名为a[0]
    printf("a = %p\n", a);
    printf("a[0] = %p\n", a[0]);
    
    //测二维数组所占内存空间,有3个一维数组,每个一维数组的空间为4*4
    //sizeof(a) = 3 * 4 * 4 = 48
    printf("sizeof(a) = %d\n", sizeof(a));

    //测第0个元素所占内存空间,a[0]为第0个一维数组int[4]的数组名,4*4=16
    printf("sizeof(a[0]) = %d\n", sizeof(a[0]) );

    //测第0行0列元素所占内存空间,第0行0列元素为一个int类型,4字节
    printf("sizeof(a[0][0]) = %d\n", sizeof(a[0][0]));

    //求二维数组行数
    printf("i = %d\n", sizeof(a) / sizeof(a[0]));

    // 求二维数组列数
    printf("j = %d\n", sizeof(a[0]) / sizeof(a[0][0]));

    //求二维数组行*列总数
    printf("n = %d\n", sizeof(a) / sizeof(a[0][0]));

    return 0;
}
int a[2][3];

a[0][0] : 第0行第0个元素
&a[0][0]: 第0行第0个元素的地址 = 01
a[0] : 第0行一维数组的数组名,a[0] = &a[0][0] = 01
&a[0] : 第0行的地址 = 01
a : 二维数组数组名,代表二维数组,也代表首行地址 &a[0]
&a : 二维数组地址

3.4 练习

#include <stdio.h>

int main()
{
    //二维数组:  五行、三列
    //行代表人:  老大到老五
    //列代表科目:语、数、外
    float a[5][3] = { { 80, 75, 56 }, { 59, 65, 71 }, { 59, 63, 70 }, { 85, 45, 90 }, { 76, 77, 45 } };

    int i, j, person_low[3] = { 0 };
    float s = 0, lesson_aver[3] = { 0 };

    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            s = s + a[j][i];
            if (a[j][i] < 60)
            {
                person_low[i]++;
            }
        }

        lesson_aver[i] = s / 5;
        s = 0;
    }

    printf("各科的平均成绩:\n");
    for (i = 0; i < 3; i++)
    {
        printf("%.2f\n", lesson_aver[i]);
    }
        
    printf("各科不及格的人数:\n");
    for (i = 0; i < 3; i++)
    {
        printf("%d\n", person_low[i]);
    }
        
    return 0;
}

4. 多维数组

多维数组的定义与二维数组类似,其语法格式具体如下:

数组类型修饰符 数组名 [n1][n2]…[nn];
//例如:
int a[3][4][5];
/*
定义了一个三维数组,数组的名字是a,数组的长度为3,每个数组的元素又是一个二维数组,这个二维数组的长度是4,并且这个二维数组中的每个元素又是一个一维数组,这个一维数组的长度是5,元素类型是int。
*/
#include <stdio.h>

int main()
{
    //int a[3][4][5] ;//定义了一个三维数组,有3个二维数组int[4][5]
    int a[3][4][5] = { { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 0 }, { 0 } }, { { 0 }, { 0 }, { 0 }, { 0 } }, { { 0 }, { 0 }, { 0 }, { 0 } } };

    int i, j, k;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            for (k = 0; k < 5; k++)
            {
                //添加访问元素代码
                printf("%d, ", a[i][j][k]);
            }
            printf("\n");
        }
    }
    return 0;
}

5. 字符数组与字符串

5.1 字符数组与字符串区别

  • C语言中没有字符串这种数据类型,可以通过char的数组来替代;

  • 字符串一定是一个char的数组,但char的数组未必是字符串;

  • 数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组

#include <stdio.h>

int main()
{
    char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' }; //普通字符数组
    printf("c1 = %s\n", c1); //乱码,因为没有’\0’结束符

    //以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串
    char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0'}; 
    printf("c2 = %s\n", c2);

    //字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
    char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
    printf("c3 = %s\n", c3);

    return 0;
}

5.2 字符串的初始化

#include <stdio.h>

// C语言没有字符串类型,通过字符数组模拟
// C语言字符串,以字符‘\0’, 数字0
int main()
{
    //不指定长度, 没有0结束符,有多少个元素就有多长
    char buf[] = { 'a', 'b', 'c' };
    printf("buf = %s\n", buf);    //乱码

    //指定长度,后面没有赋值的元素,自动补0
    char buf2[100] = { 'a', 'b', 'c' };
char buf[1000]={“hello”};
    printf("buf2 = %s\n", buf2);

    //所有元素赋值为0
    char buf3[100] = { 0 };

    //char buf4[2] = { '1', '2', '3' };//数组越界

    char buf5[50] = { '1', 'a', 'b', '0', '7' };
    printf("buf5 = %s\n", buf5);

    char buf6[50] = { '1', 'a', 'b', 0, '7' };
    printf("buf6 = %s\n", buf6);

    char buf7[50] = { '1', 'a', 'b', '\0', '7' };
    printf("buf7 = %s\n", buf7);

    //使用字符串初始化,编译器自动在后面补0,常用
    char buf8[] = "agjdslgjlsdjg";

    //'\0'后面最好不要连着数字,有可能几个数字连起来刚好是一个转义字符
    //'\ddd'八进制字义字符,'\xdd'十六进制转移字符
    // \012相当于\n
    char str[] = "\012abc";
    printf("str == %s\n", str);

    return 0;
}

5.3 字符串的输入输出

由于字符串采用了'\0'标志,字符串的输入输出将变得简单方便。

scanf从键盘读取字符串':

缺点: 遇到空格就会提前结束读取, 如果存放读取字符的空间不足,继续向后存放,会造成内存污染

#include <stdio.h>

int main()
{
    char str[100];
   
    printf("input string1 : \n");
    scanf("%s", str);//scanf(“%s”,str)默认以空格分隔
    printf("output:%s\n", str);

    return 0;
}

scanf %s格式读取,遇到\n结束,遇到空格结束

5.3.1 gets()

#include <stdio.h>
char *gets(char *s);
功能:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。
参数:
s:字符串首地址
返回值:
成功:读入的字符串
失败:NULL

gets(str)与scanf(“%s”,str)的区别:

  • gets(str)允许输入的字符串含有空格

  • scanf(“%s”,str)不允许含有空格

注意:由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况。

char str[100];
printf("请输入str: ");
gets(str);
printf("str = %s\n", str);

5.3.2 fgets()

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size- 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:
s:字符串
size:指定最大读取字符串的长度(size - 1)
stream:文件指针,如果读键盘输入的字符串,固定写为stdin
返回值:
成功:成功读取的字符串
读到文件尾或出错: NULL

fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包含结尾的“\n”,但通过fgets结尾多了“\n”。fgets()函数是安全的,不存在缓冲区溢出的问题。

char str[100];
printf("请输入str: ");
fgets(str, sizeof(str), stdin);
printf("str = \"%s\"\n", str);

5.3.3 puts()

#include <stdio.h>
int puts(const char *s);
功能:标准设备输出s字符串,在输出完成后自动输出一个'\n'。
参数:
s:字符串首地址
返回值:
成功:非负数
失败:-1
#include <stdio.h>

int main()
{
    printf("hello world");
    puts("hello world");

    return 0;
}

5.3.4 fputs()

#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中, 字符串结束符 '\0' 不写入文件。
参数:
str:字符串
stream:文件指针,如果把字符串输出到屏幕,固定写为stdout标准输出(屏幕)
返回值:
成功:0
失败:-1

fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'

printf("hello world");
puts("hello world");
fputs("hello world", stdout);

5.3.5 strlen()

5) strlen()
#include <string.h>
size_t strlen(const char *s);
功能:计算指定指定字符串s的长度, 不包含字符串结束符‘\0’
参数:
s:字符串首地址
返回值:字符串s的长度,size_t为unsigned int类型
char str[] = "abc\0defg";
int n = strlen(str);
printf("n = %d\n", n);

5.4 字符串追加

#include <stdio.h>

int main()
{
    char str1[] = "abcdef";
    char str2[] = "123456";
    char dst[100];

    int i = 0;
    while (str1[i] != 0)
    {
        dst[i] = str1[i];
        i++;
    }

    int j = 0;
    while (str2[j] != 0)
    {
        dst[i + j] = str2[j];
        j++;
    }
    dst[i + j] = 0; //字符串结束符

    printf("dst = %s\n", dst);

    return 0;
}

5.5 产生随机数

#include <stdio.h>

int main()
{
        //设置随机数种子
        //获得随机数
        //int  t = time(NULL);//time函数获得当前时间,,s
        srand(time(NULL));//设置种子
        int a = rand();//rand()获得随机数
        printf("a=%d\n",a);
        int b = rand();//rand()获得随机数
        printf("b=%d\n", b);
        system("pause");
        return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/198168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从Manifold到SNE再到t-SNE再回到Manifold

在介绍t-SNE之前&#xff0c;要从流形开始讲起。 流形Manifold 将流形引入到机器学习领域主要有两个用途&#xff1a; 改进原本欧式空间中的算法&#xff0c;使它能作用到流形上&#xff0c;直接或者间接地利用和流行的性质和构造。将流形映射到欧式空间中&#xff0c;令欧式…

软件测试面试:年后就拿到了5个offer,希望也能助你拿下满意的offer

求职&#xff0c;就像打仗&#xff0c;不仅是一场挑战自己的战斗&#xff0c;也是一场与用人单位的较量。 而求职者只有准备足够充分&#xff0c;才能在这场毫无硝烟的“战场”上取得胜利。 那么软件测试面试需要做哪些准备以及软件测试面试需要哪些技巧呢&#xff1f; 1、熟…

ThreadLocal 适合用在哪些实际生产的场景中?

在通常的业务开发中&#xff0c;ThreadLocal有两种典型的使用场景 场景1&#xff0c;ThreadLocal 用作保存每个线程独享的对象&#xff0c;为每个线程都创建一个副本&#xff0c;这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本&#xff0c;确保线程安全 …

【内网安全-隧道搭建】内网穿透_Frp上线、测试

目录 Frp&#xff08;简易上线&#xff09; 1、简述&#xff1a; 2、工具&#xff1a; 3、使用&#xff1a; 1、准备&#xff1a; 2、服务端&#xff08;公网&#xff09;&#xff1a; 2、客户端&#xff08;内网&#xff09;&#xff1a; 3、测试方法&#xff1a; 4、…

【Linux】基础IO --- 软硬链接、acm时间、动静态库制作、动静态链接、动静态库加载原理…

我用执着烧死了所有的幼稚和任性&#xff0c;那片荒野慢慢长出了理智冷漠和清醒。 文章目录一、软硬链接1.软硬链接的区别&#xff08;是否具有独立的inode&#xff09;2.软硬链接的作用2.1 软链接作用&#xff08;建立快捷方式&#xff09;2.2 硬链接作用&#xff08;防止误删…

PLC信号处理系列之滤波器设计(MATLAB滤波器设计工具箱介绍)

在学习和应用滤波器解决工程问题之前,需要了解一定的信号处理相关基础知识,有关信号和系统的学习笔记可以参看下面的专栏: https://blog.csdn.net/m0_46143730/article/details/128788864https://blog.csdn.net/m0_46143730/article/details/128788864命令行窗口输入>&g…

排序模型进阶-FTRL

5.8 排序模型进阶-FTRL 学习目标 目标 无应用 无 5.8.1 问题 在实际项目的时候&#xff0c;经常会遇到训练数据非常大导致一些算法实际上不能操作的问题。比如在推荐行业中&#xff0c;因为DSP的请求数据量特别大&#xff0c;一个星期的数据往往有上百G&#xff0c;这种级别…

combit Report Server 28

combit Report Server 28 Added Microsoft SharePoint Online task action.Added support for PostgreSQL 15.Added support for Microsoft SQL Server 2022.Added new option to Microsoft Excel export template. Converting texts starting with “” into Excel formula.Im…

力扣:除自身以外数字的乘积(详解)

前言&#xff1a;本期是关于除自身以外数字的乘积的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 ans…

【javaEE】文件

目录 文件概念 文件路径 绝对路径 相对路径 文件类型 文本文件 二进制文件 Java中对文件的操作 对文件系统的操作 get相关方法 文件类型判断和创建 文件删除 文件目录的创建 文件重命名 对文件内容的操作 字符流(操作字符数据) 代码例子 删除文件 复制文件 …

算法刷题-求素数、数据流的中位数、不同的二叉搜索树

求素数、数据流的中位数、不同的二叉搜索树求素数数据流的中位数不同的二叉搜索树求素数 求1-100内的素数&#xff1a; public static void main(String[] args){for(int i0;i<100;i) {checkPrime(i);}}private static void checkPrime(int x){boolean isPrime true;if(x…

nodejs+vue大学生提问论坛系统vscode

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面…

Linux-时间和日期、磁盘信息和进程信息

为了方便通过远程终端维护服务器时&#xff0c;查看服务器上当前系统日期和时间 /磁盘空间占用情况/程序执行情况&#xff0c;本节基本都是查询命令时间和日期datecal磁盘和目录空间dfdu进程信息pstopkill1.时间和日期序号命令作用01cal查看一个月日历&#xff0c; -y选项可以查…

consul集群解决单注册弊端

consul集群前面我们用consul注册发现服务&#xff0c;这里的弊端显而易见&#xff0c;单机版如果挂掉&#xff0c;就无法正常使用。consul的集群是复制模式&#xff0c;每个节点的信息一致。当其中一个挂掉&#xff0c;其他正常运行。consul官网建议最好是3个节点&#xff0c;其…

MyEclipse安装及需要进行的配置

安装&#xff1a;https://blog.csdn.net/qq_30764991/article/details/82531415?spm1001.2101.3001.6650.9&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-82531415-blog-126523828.pc_relevant_aa2&depth_1-utm_sou…

网络游戏与未来生存——谈一下不要因为认知不到位让孩子失去未来的机会

这个话题要从几个月前的一个事件谈起&#xff0c;先看看下面的截图&#xff1a;于是&#xff0c;那一天&#xff0c;各种阴谋论甚嚣尘上&#xff0c;大多数的话题都是直指腾讯&#xff0c;说腾讯的活动能力太强了。随后几天网上也是各种关于网络游戏毁掉孩子未来的说法和观点&a…

2022区块链投融资鸟瞰:总额超千亿元,数字货币坚挺,Web3叙事强劲

文/尹宁出品/陀螺研究院从整个区块链行业来看&#xff0c;2022年&#xff0c;在全球通胀与投资受限的环境下&#xff0c;资本圈与区块链之间可谓一波三折。在TMT、新消费、生物医药等赛道的各种消极表现下&#xff0c;年初Web3与元宇宙的横空出世正中资本下怀&#xff0c;a16z、…

c++ 快排思想

文章目录讲下思想时间复杂度优化代码实现讲下思想 我这边主要是分左右两边的指针寻找 left指针从左边寻找大于p的数 right 从右寻找小于p的数 然后找到进行交换&#xff0c;直到相遇在一起 说明这个位置是分隔的位置 而p的数就是分隔的数&#xff0c;所以对p和l进行一个…

什么都不会的应届生怎么找工作?

2023年&#xff0c;很多大学应届生都会面临到的一个问题&#xff1a;疫情三年上网课没有学到什么知识和技能&#xff0c;并且学习效果大多不理想&#xff1b;现在面临就业时对自身专业技能不自信&#xff0c;怀疑自己是否能找到工作&#xff0c;更别说是适合自己喜欢的工作。面…

Vue 3.2 源码系列:有点难的《最新 diff 算法详解》

本文首发自&#xff1a;稀土掘金、思否 博客代码已上传至github 点击这里 即可访问 另提供&#xff1a;完整代码&#xff08;tsrollup&#xff09;和视频教程 序 所谓算法指的是&#xff1a;把一种数据结构转化为另外一种数据结构的方法。 在runtime(运行时)阶段存在一个无论如…