C 程序设计教程(04)—— C 语言的数据类型(二):构造数据类型

news2025/1/11 12:40:39

C 程序设计教程(04)—— C 语言的数据类型(二):构造数据类型

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(04)—— C 语言的数据类型(二):构造数据类型
    • 一、数组类型
        • 1、数组的定义
        • 2、数组的初始化
        • 3、数组元素的访问
        • 4、数组的存储
        • 5、关于数组名
        • 6、字符串的表示
        • 7、字符数组的赋值
    • 二、结构体类型
        • 1、结构体类型
        • 2、结构体类型变量的定义
        • 3、结构体变量的初始化
        • 4、结构体成员的访问
    • 三、共用体(联合体)
        • 1、共用体的定义
        • 2、共用体变量的引用
    • 四、枚举类型
    • 五、用 typedef 定义类型
        • 1、为基本数据类型定义新的类型名
        • 2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
        • 3、为数组定义简洁的类型名称
        • 4、为指针定义简洁的名称

我们已经学过 int、char、float、double 等基本数据类型,这些数据类型只能表示某些特定的数据,不能完全表示现实中所有事物。例如:表示一个人的特征,则这个人的姓名、年龄、性别等信息就无法用基本数据类型来完成。因此,C 语言提供了构造类型。

C 语言中的构造数据类型包括:数组类型、结构体类型、共用体类型和枚举类型。

一、数组类型

数组是一个由若干相同类型的变量组成的集合,引用这些变量时可以使用同一个名称。数组由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于数组的最后一个元素,数组可以是一维、二维和多维数组。

1、数组的定义

数组的定义格式如下:

type array_name[size];       //一维数组
type array_name[size][size]; //二维数组

说明:

(1)在定义数组时,数组的元素个数([size])必须是常数(C99标准支持变长数组,但大多编译器是不支持的)。

(2)对于 m 行 n 列的二维数组,可以理解为该二维数组有 m 个元素,每个元素是一个有 n 个元素的一维数组。

2、数组的初始化

数组的初始化就是给数组元素赋初始值,数组使用 { } 初始化,在大小给定的情况下,可以完全初始化,也可以不完全初始化(其余元素默认为 0)。在大小没有给定的情况下根据初始化内容确定数组的大小。例如:

#include<stdio.h>
int main()
{
    int i,j;
	int arr1[10]={1,2,3,4,5,6,7,8,9,0}; //完全初始化,定义包含10个整型元素的数组,10个数组元素都已赋初值
    int arr2[10]={1,2,3};  //不完全初始化,定义的数组有10个元素,但只给定了3个值,其余7个值默认为0
    int arr3[]={1,2,3};    //数组大小未给定,根据初始化内容确定数组大小(含有三个整型元素)
    int arr4[2][3]={{0,1,2},{3,4,5}}; //完全初始化,二维数组可以看作若干个一维数组,分别初始化
    int arr5[][3]={{0,1,2},{3,4,5}};  //省略行数
    // int arr6[2][]={{0,1,2},{3,4,5}};  //错误!列数不可省略,编译器编不过去

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

    printf("arr2: ");
    for(i=0;i<10;i++)
    {
        printf("%d  ",arr2[i]);
    }
    printf("\n\n");  
    
    printf("arr3: ");
	for(i=0;i<3;i++)  
    {
        printf("%d  ",arr3[i]);
    }
    printf("\n\n");  

    printf("arr4: ");
	for(i=0;i<2;i++) 
    {
        for(j=0;j<3;j++) 
		printf("%d  ",arr4[i][j]);
		printf("\n");
    }
    printf("\n"); 
	   
    printf("arr5: ");
	for(i=0;i<2;i++) 
    {
        for(j=0;j<3;j++) 
		printf("%d  ",arr5[i][j]);
		printf("\n");
    }
    return 0;
}

说明:二维数组可以省略行数,但不可省略列数。

上述程序的运行结果如下:

在这里插入图片描述

3、数组元素的访问

数组通过下标引用操作符([ ])实现对数组元素的访问。比如:arr[1] 代表数组 arr 中下标为 1 的元素,arr[i] 代表数组中下标为 i 的元素。数组元素的下标是从 0 开始的。例如:

#include<stdio.h>
int main()
{
    int i;
    int arr[10];
	for(i=0;i<10;i++)
	{
		arr[i]=i*2+1;
	}
	
	printf("arr: ");
	for(i=0;i<10;i++)
	{
		printf("%d  ",arr[i]);
	}
    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

4、数组的存储

无论是一维数组还是二维数组,数组内的元素在内存中是连续存储的,相邻的两个元素之间的地址都相差一个固定的值(值的大小和数组元素的类型有关。如果数组元素类型是 int,则相差 4 个字节)。例如:

#include<stdio.h>
int main()
{
    int i,j;
    int arr1[]={1,2,3,4,5,6};
    int arr2[3][5]={{1,2,3,4,5},
	    {11,22,33,44,55},
		{111,222,333,444,555}};
    printf("输出arr1的地址:\n");
	for(i=0;i<6;i++)
	{
		printf("arr1[%d]:%p\n",i,&arr1[i]);
	}

    printf("输出arr2的地址:\n");
	for(i=0;i<3;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("arr2[%d][%d]:%p\n",i,j,&arr2[i][j]);
		}		
	}	

    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

5、关于数组名

数组名是第一个数组元素的地址。当求 sizeof(数组名) 时,得到的是整个数组所占空间的大小;&数组名,是整个数组的地址。例如:

#include<stdio.h>
int main()
{
    int arr1[5]={1,2,3,4,5};
    int arr2[2][3]={{1,2,3},{4,5,6}};
    //结果:20(5个元素,每个元素4个字节)
    printf("arr1的大小:%d\n",sizeof(arr1)); 
	//结果:24(整个数组大小)
    printf("arr2的大小:%d\n",sizeof(arr2)); 
	//结果:12(arr2[0]也是数组名,是二维数组第一行元素的数组名)
    printf("arr2[0]的大小:%d\n",sizeof(arr2[0]));
    //以下三个地址一样,但是第三个含义与前两个不一样
    printf("arr1的地址:%p\n",arr1);
    printf("第一个元素的地址:%p\n",&arr1[0]);
    printf("整个数组的地址:%p\n",&arr1);
    //前两个地址一样(都是arr1[1]的地址)
	printf("arr1+1的地址:%p\n",arr1+1);
    printf("arr1[0]+1的地址:%p\n",&arr1[0]+1);
    //&arr是整个数组的地址,+1跳过整个数组
    printf("&arr1+1的地址:%p\n",&arr1+1);
    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

6、字符串的表示

C 语言并没有字符串类型,但允许使用字符串常量。字符串常量是用一对双引号括起来的一串字符。例如:

“China”、“OS”、“yes”、"0373-3048111"等。

字符串常量在存储时,系统自动在字符串的末尾加一个“字符串结束标志”(即:ASCII 码为 0 的字符 NULL),常用“\0”表示。因此,程序中长度为 n 个字符的字符串常量,在内存中占用 n+1 个字节的存储空间。

在定义字符型数组时,必须比要存放的最大字符数多一个字符。例如:

#include<stdio.h>
int main()
{
    char str[20]="I am a student.";
    printf("%s\n",str);
    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

7、字符数组的赋值

定义字符数组时可以同时对数组进行初始化,但定义完成后,就不能按初始化的形式对其赋值了。例如:

char a[10]="abcdefgh";  //正确
char b[10];
b="abcdefgh";           //错误

(1)单字符赋值:通过数组下标方式或指针方式,引用数组元素,进行赋值。

(2)字符串赋值:使用 string.h 头文件中的字符串操作函数(strcpy)进行赋值。

#include<stdio.h>
#include<string.h>
int main()
{
	//单字符赋值 
	char a[10];
	a[0]='C';a[1]='h';a[2]='i';a[3]='n';a[4]='a';
	//字符串赋值
	char b[10];
	strcpy(b,"abcdefgh");
	printf("数组a的内容: %s\n",a);
	printf("数组b的内容: %s\n",b);
	return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

二、结构体类型

结构体是由一组称为成员(成员变量)的不同数据所组成的,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。

结构体的成员可以是数组、指针变量、甚至是其他结构体,一般描述复杂对象时用到结构体。

结构体采用关键字 struct 来进行构建。

1、结构体类型

例如:成绩表的结构如下:

班级学号姓名操作系统数据结构计算机网络
字符串长整型字符串实型实型实型

通讯录的结构如下:

姓名工作单位家庭住址邮编电话号码E-mail
字符串字符串字符串字符串字符串字符串

把成绩和通讯录定义为结构体类型:

//结构体类型的定义格式:
struct 结构体名称
{
    成员列表
};

//定义“成绩”结构体
struct score
{
    char grade[20];  //班级
    long number;     //学号
    char name[20];   //姓名
    float os;        //操作系统
    float datastru;  //数据结构
    float compnet;   //计算机网络
};

//定义“通讯录”结构体
struct addr
{
    char name[20];         //姓名
    char department[30];   //工作单位
    char address[30];      //家庭住址
    char box[6];           //邮编
    char phone[20];        //电话
    char email[50];        //E-mail
};

2、结构体类型变量的定义

结构体类型变量的定义与其他类型的变量的定义相同,但结构体类型需要预先定义。结构体变量的定义有三种形式:

(1)先定义结构体类型,再定义结构体类型变量

//定义“成绩”结构体
struct score
{
    char grade[20];  //班级
    long number;     //学号
    char name[20];   //姓名
    float os;        //操作系统
    float datastru;  //数据结构
    float compnet;   //计算机网络
};
struct score student1,student2;  //定义结构体类型变量

(2)定义结构体类型同时定义结构体变量

struct score
{
    char grade[20];  //班级
    long number;     //学号
    char name[20];   //姓名
    float os;        //操作系统
    float datastru;  //数据结构
    float compnet;   //计算机网络
} score student1,student2;  //定义结构体类型变量
struct score student3;      //定义其他变量

(3)直接定义结构体类型变量

这种定义方式由于没有为结构体类型指定名称,则只能使用一次。不能再次定义该结构体类型的其他变量。

struct 
{
    char grade[20];  //班级
    long number;     //学号
    char name[20];   //姓名
    float os;        //操作系统
    float datastru;  //数据结构
    float compnet;   //计算机网络
} student1,student2;  //定义结构体类型变量

3、结构体变量的初始化

结构体变量的初始化采用 { },成员变量间用逗号隔开便可。例如:

#include<stdio.h>
int main()
{
	struct score
	{
	    char grade[20];  //班级
    	long number;     //学号
    	char name[20];   //姓名
    	float os;        //操作系统
    	float datastru;  //数据结构
    	float compnet;   //计算机网络
	};
	struct score s1={"xinguan211",2021021401,"tom",87.5,90.0,87.0};    //定义结构体类型变量
	printf("%s\n%d\n%s\n%lf\n%lf\n%lf\n",s1.grade,s1.number,s1.name,s1.os,s1.datastru,s1.compnet);
	return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

4、结构体成员的访问

(1)采用点操作符(.)访问结构体成员

相同结构体类型的结构体能够相互赋值:如有 struct stu s1,s2; 就可以有s1=s2,不同结构体类型的结构体不能相互赋值。结构体成员引用的一般格式:结构体变量名.成员名。例如:

#include<stdio.h>
#include<string.h>
int main()
{
	struct stu
	{
   		char name[20];
   		int age;
   		char id[20];
	};

	struct stu s1={"tom",20,"20210224111"};
	struct stu s2;
	s2=s1;
	strcpy(s2.name,"jerry");
	s1.age=22;
	strcpy(s2.id,"20210224345");
	printf("学生s1的信息如下:\n");
	printf("name: %s\nage: %d\nid: %s\n\n",s1.name,s1.age,s1.id);
	printf("学生s2的信息如下:\n");
	printf("name: %s\nage: %d\nid: %s\n",s2.name,s2.age,s2.id);
	return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

(2)采用(->)操作符来访问结构体成员

当我们访问的不是一个结构体变量,而是指向一个结构体变量的指针,这时我们可以使用(->)操作符来访问结构体成员。例如:

#include<stdio.h>
struct stu
{
   	char name[20];
   	int age;
   	char id[20];
};
void print(struct stu *s2) 
{
   	printf("%s %d %s\n",s2->name,s2->age,s2->id);
}

int main()
{
	struct stu s1={"tom",20,"20210224111"};
	print(&s1);
	return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

三、共用体(联合体)

一般情况下,系统会为每一个变量开辟独立的存储空间。例如:

char a;
int b;
float c;

系统将为这三个变量分别开辟1个字节、2个字节和4个字节的存储空间。使用共用体类型(union)可以让这三个变量共用一块内存空间。

1、共用体的定义

共用体的定义格式如下:

union 共用体名
{成员列表};

以下代码定义共用体类型的为data,该共用体中有三个成员,分别为a、b、c,它们占用同一个起始地址的存储空间,内存长度等于最长的成员的长度。

//定义共用体类型data
union data
{
	char a;
	int b;
	float c;
};

和定义结构体变量一样,可以用以下三种方式定义共用体变量:

// 格式1
union data
{
	char a;
	int b;
	float c;
};
union data x,y;

// 格式2
union data
{
	char a;
	int b;
	float c;
} x,y;

// 格式3
union 
{
	char a;
	int b;
	float c;
} x,y;

2、共用体变量的引用

定义了共用体变量之后,可以采用如下方式引用共用体变量的成员:

变量名.成员名

对共用体变量的说明:

(1)同一个内存段可以用来存放几种不同类型的成员,但每一时刻只能存放其中一种。也就是说,每一时刻只有一个成员起作用。

(2)共用体变量中起作用的是最后一次被赋值的成员。例如:

#include<stdio.h>
#include<string.h>
int main()
{
	union data
	{
		char a;
		int b;
		float c;
	};
	union data x;
	x.a='a';
	x.b=10;
	x.c=15.3;
	printf("%c\n",x.a);
	printf("%d\n",x.b);
	printf("%f\n",x.c);
	return 0;
}

完成以上三个赋值运算之后,只有 x.c 是有效的,x.a 和 x.b 已经无意义了。

以上程序的运行结果如下:

在这里插入图片描述

(3)共用体变量的地址和它的各成员的地址相同。例如:

#include<stdio.h>
#include<string.h>
int main()
{
	union data
	{
		char a;
		int b;
		float c;
	};
	union data x;
	x.a='a';
	x.b=10;
	x.c=15.3;
	printf("%p\n",&x);
	printf("%p\n",&x.a);
	printf("%p\n",&x.b);
	printf("%p\n",&x.c);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

(4)不能对共用体变量赋值,也不在定义共用体变量时对它进行初始化。例如:

union data
{
    char a;
    int b;
    float c;
} x={'a',10,15.3}; //错误,不能对共用体变量初始化
a=1;               //错误,不能对共用体变量赋值
union data m=a;    //错误

(5)不能把共用体变量作为函数参数,也不能使函数返回共用体类型的值,但可以使用指向共用体变量的指针。

(6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型的定义中,数组也可以作为共用体的成员。

四、枚举类型

枚举就是把变量可能取到的值一一列举出来,变量的取值只局限于列举出来的值的范围。声明枚举类型使用 enum 保留字,例如:

//定义枚举类型
enum weekday{sun,mon,tus,wed,thu,fri,sat};
//定义枚举类型的变量
enum weekday workday,weekend;
//也可以直接定义枚举类型的变量
enum {sun,mon,tus,wed,thu,fri,sat} workday,weekend;
//为枚举类型的变量赋值
workday = mon;
weekend = sun;

说明:

(1)枚举元素按常量处理,称为枚举常量,不能给枚举元素赋值。例如以下赋值是错误的:

sun = 0;
mon = 1;

(2)枚举元素作为常量,C 语言按枚举元素定义的顺序将他们的值定义为0、1、2、…。在前面的定义中,sun 的值为 0,mon 的值为 1,…,sat 的值为 6。可以改变枚举元素的值,如:

#include<stdio.h>
int main()
{
    enum weekday{sun=7,mon=1,tus,wed,thu,fri,sat};
    enum weekday workday,weekend;
    workday = mon;
    weekend = sun;
    printf("monday:%d\nsunday:%d",workday,weekend);
    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

(3)枚举值可用于构造条件,例如:

if(workday == mon) {...}
if(workday > sun) {...}

(4)整数不能直接赋给枚举变量,因为他们属于不同的类型。需要进行强制类型转换才能赋值。例如:

workday = 2; //错误
workday = (enum weekday)2; //相当于将序号为2的枚举元素赋给workday,等价于下面的语句:
workday = tue;

(5)不能对枚举类型的变量直接读写,只能输出枚举变量的序号。

五、用 typedef 定义类型

除了可以直接使用标准类型名(如:int、char、float、double、long 等)和结构体、共用体、指针、枚举类型外,还可以用 typedef 定义新的类型名来代替已有的类型名。

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	typedef struct
	{
		int month;
		int day;
		int year;
	} DATE;  //定义新的类型名为DATE
	typedef int ARR[10]; 
	DATE birthday={10,5,2000};
	ARR a={0,1,2,3,4,5,6,7,8,9};
	int i;
	printf("birthday: %d-%d-%d\n\n",birthday.year,birthday.month,birthday.day);
	for(i=0;i<10;i++)
	{
		printf("数组元素a[%d]的值:%d\n",i,a[i]);
	}
	return 0;

以上程序的输出结果如下:

在这里插入图片描述

typedef 主要用于以下几种情形:

1、为基本数据类型定义新的类型名

比如:用 typedef 来定义与平台无关的类型。
可以定义一个名称为 REAL 的浮点类型:typedef long double REAL;
在不支持 long double 的机器上,可以修改为:typedef double REAL;
如果连 double 都不支持,可以修改为:typedef float REAL;

当跨平台时,只要修改 typedef 本身就行,不用对其他源码做任何修改。

#include<stdio.h>
#include<string.h>
int main()
{
	typedef double REAL;
	REAL a=100.2;
	printf("%f",a);
	return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

例1:

typedef struct tagPoint
{
    double x;
    double y;
    double z;
} Point;

//上面的代码实际上完成了两个操作:
//1、定义一个新的结构类型
//其中:struct 关键字和 tagPoint 一起构成了这个结构类型
struct tagPoint
{
    double x;
    double y;
    double z;
} ;

//2、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:
typedef struct tagPoint Point;

//然后就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:
Point oPoint1={1001000};
Point oPoint2;

例2:

#include <stdio.h>
//定义两个类型,一个整型的别名 INTEGER,一个整型指针 PINT,这两个变量没有联系,是独立的。
int main()
{
    typedef int INTEGER, *PINT;
    INTEGER a,c;
    PINT b;
	a=10;  
	c=20;  
    b=&c;
    printf("&a=%p\n",&a);
    printf("b=%p\n",b);
    printf("a=%d\n",a);
    printf("*b=%d\n",*b);
    return 0;
}

以上程序的输出结果如下:

在这里插入图片描述

例3:

typedef int ElemType; //定义顺序表的数据元素为整数。
typedef struct
{
 	ElemType data[MAXSIZE];   //用数组存储顺序表中的元素
	unsigned int length;      //顺序表中元素的个数
} SeqList,*PSeqList;  //定义两个类型,一个是结构体别名SeqList和一个结构体指针PSeqList。

3、为数组定义简洁的类型名称

例如:

typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;

4、为指针定义简洁的名称

例如:

typedef char* PCHAR;
PCHAR pa;

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

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

相关文章

【Go基础】结构体和流程控制语句

文章目录一、结构体1. 结构体创建、访问与修改2. 结构体指针3. 结构体嵌套4. 深拷贝与浅拷贝二、流程控制语句1. if2. switch3. for4. break与continue5. goto与Label一、结构体 1. 结构体创建、访问与修改 定义结构体 type User struct {id intscore float32enrollment tim…

项目实用方式总结

目录 一、后端接收前端请求的方式 1、接收前端传递的单个参数 直接加在url后 通过&#xff1f;拼接 2、接收Json对象 3、一次传递多个数据不使用实例对象的方式 二、vue中使用动态数字 使展示的数字从0动态增长到指定数字 三、在Vue中使用动态数据 四、使用插槽获取表…

项目分享-校园宿舍管理系统

DormitoryManage 一、简介 项目简述&#xff1a; 本系统采用MVCJ2EEMysql实现&#xff0c;使用是Tomcat10.0作为WEB服务器&#xff0c;提供适应性强的Internet服务器功能&#xff0c;具有很高的执行效率。其中&#xff1a; JSP用于页面的设计&#xff0c;展示数据。Java用来处…

Java中String类型比较,equals()和==以及compareTo() 比较的区别

总结&#xff1a; 操作符的作用 用于基本数据类型的比较 判断引用是否指向堆内存的同一块地址。 equals()方法的作用 用于判断两个变量是否是对同一个对象的引用&#xff0c;即堆中的内容是否相同&#xff0c;返回值为布尔类型 compareTo() 方法用于两种方式的比较 字符串与对象…

使用fail2ban保护Domino

大家好&#xff0c;才是真的好。 不少人把Domino服务器直接挂在互联网上&#xff0c;前面不加任何防护&#xff0c;让Domino控制台上不住地显示饱受攻击毒打的惨状。 这些攻击&#xff0c;有从Web HTTP协议进来的攻击&#xff1a; [007577:000017-00007F621246D700] 20.03.20…

蓝牙DID蓝牙认证BQB

零. 概述主要介绍下蓝牙协议栈&#xff08;bluetooth stack&#xff09;传统蓝牙音频协议之蓝牙人机接口设备协议&#xff08;HID&#xff09;概念介绍HID协议有很多应用&#xff0c;比如蓝牙鼠标&#xff0c;键盘&#xff0c;手柄&#xff0c;自拍杆等都会用到HID协议&#xf…

「数据密集型系统搭建」原理篇|OLAP、OLTP,竟然是两个世界

本篇来聊聊OLAP与OLTP的区别以及它们各自的适用场景&#xff0c;以此话题为导引和大家聊聊技术视野与知识储备对于研发同学的重要性&#xff0c;最后站在事务处理与在线分析的角度分别论述下两个数据世界的底层构建逻辑。 OLAP、OLTP的概念与区别 概念 了解OLAP、OLTP的概念&…

Centos安装IotDB(集群版)

文章目录一、前置检查二、集群配置说明1、通用配置2、ConfigNode 配置3、DataNode 配置三、集群操作1、启动Seed-ConfigNode2、增加ConfigNode&#xff08;2个&#xff09;3、增加DataNode(3个)4、验证集群集群安装版本V1.0.0&#xff0c;相关下载地址可查看 单机版安装集群官网…

软件测试之沟通技巧

沟通是一门艺术&#xff0c;良好的沟通有助于快速解决问题&#xff0c;奠定双方长期合作、相互信任的基础。 常见沟通问题&#xff1a; 1、与对方不在同一频道&#xff0c;多见于首次沟通或者了解深度不一致场景下。 2、想当然以为对方了解自己问题&#xff0c;比如消息前后文都…

0基础学Java-02Java基础概念

1.高级语言的编译运行方式编译型&#xff1a;C&#xff08;.c->.obj->运行&#xff09;解释型&#xff1a;Python按行翻译混合型&#xff1a;Java不是直接运行在系统中的&#xff0c;是运行在虚拟机中的Java跨平台原理&#xff1a;通过虚拟机实现的2.JRE和JDKJVM - 核心内…

数组和字符串

1、数组 1.1 集合、列表、数组 集合&#xff1a;由一个或多个确定的元素所构成的整体 集合特点&#xff1a;集合中的元素类型不一定相同&#xff1b;无序 列表&#xff08;又称线性列表&#xff09;&#xff1a;即按照一定的线性顺序&#xff0c;排列而成的数据项的集合。–…

【阅读】《MYSQL技术内幕:InnoDB》索引使用

B树索引使用 不同应用下 OLTP 应用中&#xff0c;查询操作只从数据库中取得一小部分数据&#xff0c;如根据主键值取得用户信息&#xff0c;根据订单号取得订单的详细信息。通常会添加主键索引OLAP 应用中&#xff0c;查询多是面向分析的查询&#xff0c;目的是为决策者提供支…

WordPress网站速度优化教程

网站访问速度是影响网站访客流量的重要因素&#xff0c;几秒内打不开网站会导致很多访客的流失&#xff0c;因此在WordPress程序中网站速度优化尤为重要。 当然服务器地区和配置也会影响访问速度 服务器速度&#xff1a;国内>香港或国外服务器 配置你有钱就上好的&#xff0…

【7.2 指标的应用与设计(15%)-业务数据分析】——CDA

目录 I.大纲 II.可视化图表 2.1 业务图表决策树 2.2 比较 2.3 序列 2.4 构成 2.5 描述 I.大纲 II.可视化图表 2.1 业务图表决策树 分成了4类&#xff1a;比较、序列、构成、描述类 1.比较类&#xff1a;不同对象、项目间 大小多少&#xff0c;好坏关系程度。&#xff…

TikTok Shop美国小店现状如何?

SHOP美国小店现状如何&#xff1f;在2022年11月份&#xff0c;TikTok已经正式公布了TikTok Shop美国站&#xff0c;那么目前情况如何呢&#xff1f;有什么困扰&#xff1f;有参加美国小店闭环测试之后的效果并不乐观的卖家表示&#xff0c;美国电商市场相对稳定&#xff0c;且中…

使用Docker部署前后端分离项目

目录 引言 部署需要用到的镜像汇总 1. Redis部署 &#xff08;1&#xff09;搜索Redis镜像 &#xff08;2&#xff09;拉取Redis镜像 &#xff08;3&#xff09;创建Redis容器 2. MySQL部署 &#xff08;1&#xff09;拉取MySQL镜像、 &#xff08;2&#xff09;查看…

《WebGL编程指南》学习笔记(更新中)

《WebGL编程指南》学习笔记前言1.第一章 WebGL概述1.1 WebGL优势1.2 WebGL起源1.3 WebGL程序结构2.第二章 WebGL入门2.1 了解canvas2.1.1 使用canvas绘制一个长方形2.2 第一个WebGL程序&#xff08;清除画布&#xff09;2.3 绘制一个点&#xff08;版本1——了解着色器&#xf…

k8s之job和cronjob

写在前面 本文一起看下使用k8s来进行作业和定时作业。 1&#xff1a;k8s的业务类型 如果是按照业务类型来划分的话&#xff0c;可以分为离线业务和在线业务&#xff0c;如下&#xff1a; 在线业务&#xff1a;容器启动之后就一直不退出的业务&#xff0c;如Nginx 离线业务&…

XSS-Game 通关教程,XSS-Game level1-18,XSS靶场通关教程

​ 「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a; 此文章已录入专栏 靶场通关教程 XSS-GameXSS-Game level1XSS-Game level2XSS-Game level3XSS-Game level4XSS-…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.15 绘制温度曲线

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1L24y1Q7hc 前面已经讲解了 QPainter 绘图的基本使用 其中包括&#xff1a; 绘制图形 点、线、矩形、圆角矩形、椭圆、圆、圆弧、饼图、弦图、多段线、多边形、路径、文本、图片 画笔设置 线宽…