【C数据类型】数组(一维、动态一维、二维、动态二维、三维)

动态二维数组类(C++ Vector) C++、vector、类实现二维动态数组,运算符重载,矩阵相加、矩阵相乘 阅读详情

数组就是把多个拥有相同数据类型的数据放在一起,成为一个整体。在C语言中的数组有着它的特性,在初学时了解它特性(先不关心它的底层原理)在代码中是如何体系的,有助于写出较好的代码!


Table of Contents

一维数组

一维数组a和&a的区别辨析

一维动态数组

二维数组

引用形式

二维数组作参数传递

二维动态数组

最原始实现

逻辑严密

释放内存

区分行列

三维数组

数组之间的相互转化

二维数组转三维数组

三维数组的xyz相互转化


一维数组

一维数组的初始化:
1,申明即初始化;
2,先申明,再定义
;

void MyArray()
{
	int a[3] = { 1,2,3 }; //1,申明即初始化;
	int b[3]; //2,先申明,再定义
	for (int i = 0; i < 3; i++)
	{
		b[i] = i + 1;
	}
}

一维数组的引用方式

  •        a[2]
  •        *(a+2)
  •        (&a[1])[1] //在a[1]的基础上再前进1个;
  •        *(p+2) 注:先定义指针p=a;
  •        p[2]
void MyArray()
{
	char a[5] = { 'a','b','c','d','e' };
	char* p;
	p = a; //p保存的是数组a的首元素的地址;

	printf("a[2]=%c\n", a[2]);
	printf("*(a+2)=%c\n", *(a + 2));
	printf("(&a[1])[1]=%c\n", (&a[1])[1]);
	printf("(&p[1])[1]=%c\n", (&p[1])[1]);
	printf("p[2]=%c\n", p[2]);
	printf("*(p+2)=%c\n", *(p + 2));
}

一维数组a和&a的区别辨析

//一维数组a和&a的区别辨析
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main()
{
	char b[30];
	printf("&b:%d, &b+1:%d\n", &b, &b+1);//&b代表数组的首元素地址,步长为整个数据长度乘以数据类型
	//&b:16580044, &b+1:16580074  //单步增量为30

	printf("b:%d, b+1:%d\n", b, b+1);//b代表数组的首元素地址,步长为数据类型
	//b:16580044, b + 1 : 16580045  //单步增量为1

	system("pause");
	return 0;
}

辨析一维数组的加一和其地址加一

辨析一维数组的加一和其地址加一
#include <stdio.h>

int main()
{
	int a = 10; //告诉编译器,分配4个字节的内存
	int b[10];  //告诉编译器,分配4*10 = 40 个字节的内存
				//b+1 和 &b+1的结果不一样,为啥?
	printf("b:%p, b+1: %p, &b:%p, &b+1: %p\n", b, b + 1, &b, &b + 1);
	//是因为 b 和 &b 所代表的数据类型不一样
	//b 代表数组首元素的地址,一个元素4字节,加1,则加4个字节;
	//&b 代表整体数组的地址,一个数组4*10字节,加1,则加40个字节;
	return 0;
}

 

一维动态数组

传统一维数组的缺点

“传统数组”就是前面所使用的数组,与动态内存分配相比,传统数组主要有以下几个缺点:

  1. 数组的长度必须事先指定,而且只能是常量,不能是变量。比如像下面这么写就是对的:

int a[5];

而像下面这么写就是错的:

int length = 5;

int a[length];  //错误

  1. 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小。
  2. 对于数组所占内存空间程序员无法手动编程释放,只能在函数运行结束后由系统自动释放,所以在一个函数中定义的数组只能在该函数运行期间被其他函数使用。

malloc函数的使用:

那么动态内存是怎么造出来的?在讲如何动态地把一个数组造出来之前,我们必须要先介绍 malloc 函数的使用。

malloc 是一个系统函数,它是 memory allocate 的缩写。其中memory是“内存”的意思,allocate是“分配”的意思。顾名思义 malloc 函数的功能就是“分配内存”。要调用它必须要包含头文件<stdlib.h>。它的原型为:

# include <stdlib.h>

void *malloc(unsigned long size);

 

malloc 函数只有一个形参,并且是整型。该函数的功能是在内存的动态存储空间即堆中分配一个长度为size的连续空间。函数的返回值是一个指向所分配内存空间起始地址的指针,类型为 void*型。

简单的理解,malloc 函数的返回值是一个地址,这个地址就是动态分配的内存空间的起始地址。如果此函数未能成功地执行,如内存空间不足,则返回空指针 NULL。

 

那么,如何判断一个内存是静态内存还是动态内存呢?凡是动态分配的内存都有一个标志:都是用一个系统的动态分配函数来实现的,如 malloc 或 calloc。

      int i = 5; //静态分配

      int *p = (int*)malloc(4); //动态分配

 

动态数组的一般原则:

  1. malloc是由程序员在堆栈动态开辟空间
  2. 返回值开辟空间的首地址,但是类型是void *,需要强制类型转换
  3. 分配的内存空间应该能整除类型所占的字节数
  4. 包含头文件malloc.h
  5. 只能用free(p)来释放p所指向的动态开辟的内存空间。
  6. 对动态内存空间的操作,用*p来操作。
  7. 可以用多个指针指向这个动态空间
  8. 当有多个指针只向这个动态空间时,只能用free一个指针,多次重复释放要被报错
  9. 可以将动态开辟的的内存指针作为函数参数

第一个动态数组:

第一个动态数组
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

int main()
{
	int length, i; //length是数组的长度,i是循环变量

	scanf("%d", &length);
	int *p = (int *)malloc(20); //构造一个一维数组,长度是4字节 * 5个=20字节

	if (length > 5)
	{
		printf("长度超出了5个,需要重新申请长度。\n");
		p = (int*)realloc(p, length * 4);
	}
	for (i = 0; i < length; i++) //初始化
	{
		p[i] = i;
	}
	for (i = 0; i < length; i++) //输出
	{
		printf("%4d", p[i]);
	}
	free(p);

	system("pause");
	return 0;
}

一维动态数组的实例:

一维动态数组的实例
#include <stdio.h>
#include <time.h> //必不可少头文件:随机数
#include <stdlib.h> //必不可少头文件:动态分配空间

void GetRandomNumber(int* a, int n)
{
	srand((unsigned int)time(NULL));
	int i;
	for (i = 0; i < n; i++)
	{
		a[i] = rand() % 100;
	}
}
void show(int* a, int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}

int main()
{
	int* a = NULL;
	int n;
	scanf("%d", &n);
	a = (int*)malloc(sizeof(int) * n);

	GetRandomNumber(a, n);
	show(a, n);

	return 0;
}

二维数组

理解二维数组:

   a[x][y]    本质是有x个一维数组,每个一维数组里面还存放着y个元素;

   a[2][3]    本质是有2个一维数组,每个数组里存着3个元素;

二维数组的本质:

char a0[30] = "22222222222";
char a1[30] = "11111111111";
char a2[30] = "bbbbbbbbbbb";
char a3[30] = "aaaaaaaaaaaa";
//4个a[30]的一维数组,这样写很冗余,能不能把四个写成一个整体呢?二维数组
//定义二维数组,不写第一个[]值有条件, 必须要初始化
//a代表首行地址,首行地址和首行首元素地址有区别,但是他们的值是一样区别:
//步长不一样:当a代表首行地址时步长为整个数组长度;当a代表首行元素地址时步长为单个类型的长度;
char a[][30] = { "22222222222", "11111111111", "bbbbbbbbbbb", "aaaaaaaaaaaa" };

二维数组的初始化:

    int a[4][5]; //第一种方式; 
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			a[i][j] = i * j;
		}
	}

int a[4][5] = { //即表示有4个一维数组,每个数组里有5个元素;
	{10,20,30,40,50},
	{11,21,31,41,51},
	{12,22,32,42,52},
	{13,23,33,43,53}
	}; //等价于a[4][5]={10,20,30,40,50,11,21,31,41,51,……43,53};

printf("a[2][2]=%d\n", a[2][2]);
printf("*(a[i]+j)=%d\n",*(a[2]+2)); //第i行的前进j个元素;
printf("*(*(a+i)+j)=%d\n",*(*(a+2)+2)); //先前进到第i行,再前进到第j个元素;
printf("(*(a+i))[j]=%d\n",(*(a+2))[2]);
printf("*(&a[0][0]+i*5+j)=%d\n", *(&a[0][0] + 2 * 5 + 2));

引用形式

先定义数组:a[4][5]

  1. a[i][j]
  2. *(a[i]+j) //在第i+1个一维数组基础上,再走j个位置;
  3. *(*(a+i)+j)
  4. (*(a+i))[j]
  5. *(&a[0][0]+i*5+j)

若定义:int * p[4](指针的数组), m ;

for(m=0; m<4;m++) p[m] = a[m] ;

  1. p[i][j]
  2. *(p[i]+j)
  3. *(*(p+i)+j)
  4. (*(p+i))[j] //请与⑴-⑷对比

若定义 int (*q)[5](数组的指针); q=a ;

  1. q[i][j]
  2. *(q[i]+j)
  3. *(*(q+i)+j)
  4. (*(q+i))[j] 

 

二维数组的a和&a辨析

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	//初识化方式1,
	int a1[3][4] = {
		{ 1, 2, 3, 4 },
	{ 5, 6, 7, 8 },
	{ 9, 10, 11, 12 }
	};
	//初始化方式2,等价于方式1
	int a2[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	//初始化方式3,等价于方式1和2
	int a3[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++) //显示二维数组
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d ", a3[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	//二维数组数组名代表第0行的首地址(区别于第0行首元素地址,虽然值一样)
	//区别是它们步长不一样
	printf("a:%d, a+1:%d\n", a3, a3 + 1); //步长为:16,因为是首行的所有地址
    //a:9435728, a + 1 : 9435744  //地址值

	printf("%d, %d\n", *(a3 + 0), *(a3 + 0) + 1); //第0行首元素地址,前进一位
	//9435728, 9435732 //地址值

	printf("%d, %d\n", a3[0], a3[0] + 1);
	//9435728, 9435732  //地址值

	//二维数组a中:
	// a : 代表第0行首地址
	// a+i   等价于  &a[i] : 代表第i行首地址
	// *(a+i) 等价于 a[i] : 代表第i行首元素地址
	// *(a+i)+j  -> &a[i][j]: 第i行第j列元素的地址
	// *(*(a+i)+j) -> a[i][j]: 第i行第j列元素的 值

	system("pause");
}

二维数组作参数传递

两种形式:

  1. void MyFunction(char **a, int n);
  2. void MyFunction(char a[][30], int n);
二维数组在函数间传递
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void print_array_err(char **a, int n) //方式一
{
	printf("a: %d, a+1:%d\n", a, a + 1);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		//printf("%s\n", a[i]); //首行地址,和首行首元素地址的值是一样
		// a+i, *(a+i)
	}
}

void print_array(char a[][30], int n) //方式二
{
	//printf("a: %d, a+1:%d\n", a, a + 1);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s, ", a[i]); //首行地址,和首行首元素地址的值是一样

	}
	printf("\n");
}

void sort_array(char a[][30], int n)
{
	int i = 0;
	int j = 0;
	char tmp[30];

	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(a[i], a[j])> 0)
			{
				//交换的内存块
				strcpy(tmp, a[i]);
				strcpy(a[i], a[j]);
				strcpy(a[j], tmp);
			}
		}
	}
}

int main()
{
	char a[][30] = { "22222222222", "11111111111", "bbbbbbbbbbb", "aaaaaaaaaaaa" };
	int n = sizeof(a) / sizeof(a[0]);

	printf("before sort:\n");
	print_array(a, n);

	sort_array(a, n);

	printf("\nafter sort:\n");
	print_array(a, n);

	printf("\n");
	system("pause");
	return 0;
}

二维动态数组

常规的二维数组申明及使用
void NomalDoubleArray(int a[][5]) //注意二维数组在参数传递中的格式;
{
	for (i = 0; i<2; i++)
	{
		for (j = 0; j<5; j++)
		{
			a[i][j] = i * j;
			printf("%2d", a[i][j]);
		}
		putchar('\n');
	}
}

int main()
{
	int a[2][5]; //申明一个二维数组; 
	NomalDoubleArray(a);
	return 0;
}

牛逼的指针形式二维动态数组的使用方式:

a.声明:int **a;

b.给内存:a=(int **)malloc(二维数的行数 * seizeof(int*));

      for(i=0;i<二维数组的行数;i++) 

            a[i]=(int *)malloc(每行有多少个元素 * sizeof(int));

c.即可以如常规的二维数组使用;

最原始实现

动态的二维数组(最原始实现)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h> //必不可少头文件
#include <stdlib.h> //必不可少头文件

void GetRandomNumber(int** a, int n)
{
	srand((unsigned int)time(NULL));
	int i, j;
	for (i = 0; i < n; i++)
	{
		a[i] = (int*)malloc(sizeof(int) * n); //表明每行有n个元素位置
		for (j = 0; j < n; j++)
		{
			a[i][j] = rand()%100;
		}
	}
}
void show(int** a, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d  ", a[i][j]);
		}
		printf("\n第%d行完毕!\n", i+1);
	}
}

int main()
{
	int n = 100;
	int** a; //申明一个二维数组指针、二维指针变量

	a = (int**)malloc(sizeof(int*) * n); //表明二维数组总共有n行

	GetRandomNumber(a, n);
	show(a, n);
	return 0;
}

逻辑严密

二维动态数组要逻辑严密地使用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void InitArray(char** a, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		a[i] = (char*)malloc(sizeof(char) * n);
		if (a[i] == NULL) //如果没有判空操作,上一行代码则会发出警告:“取消对NULL指针的引用”
		{
			return;
		}
		for (j = 0; j < n; j++)
		{
			a[i][j] = 'a';
		}
	}
}
void ShowArray(char** a, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%c ", a[i][j]);
		}
		printf("\n一行输出完了\n");
	}
}
int main()
{
	char** a;
	int n = 100;

	a = (char**)malloc(sizeof(char*) * n); //这里千万不能写为” sizeof(char) * n”!!!
	InitArray(a, n);
	ShowArray(a, n);

	return 0;
}

释放内存

释放二维动态数组内存
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void InitArray(char** a, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		a[i] = (char*)malloc(sizeof(char) * n);
		if (a[i] == NULL) //如果没有判空操作,上一行代码则会发出警告:“取消对NULL指针的引用”
		{
			return;
		}
		for (j = 0; j < n; j++)
		{
			a[i][j] = 'a';
		}
	}
}
void ReleaseArray(char** a, int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		free(*(a + i));
	}
}
void ShowArray(char** a, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%c ", a[i][j]);
		}
		printf("\n一行输出完了\n");
	}
}
int main()
{
	char** a;
	int n = 100;

	a = (char**)malloc(sizeof(char*) * n);
	InitArray(a, n);
	ShowArray(a, n);
	ReleaseArray(a, n);

	return 0;
}

正常返回: 

区分行列

区分行列的动态二维数组
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int** a;
	int i, j;
	int row, column; //行,列
	row = 2; column = 3;
	/*
	2行3列为:
	第一行第一列	第一行第二列
	第二行第一列	第二行第二列
	*/

	a = (int**)malloc(sizeof(int*) * row);
	for (i = 0; i < row; i++)
	{
		a[i] = (int*)malloc(sizeof(int) * column);
		for (j = 0; j < column; j++)
		{
			a[i][j] = i * j;
		}
	}

	for (i = 0; i < row; i++)
	{
		for (j = 0; j < column; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}
/*
输出:
0 0 0
0 1 2
*/

三维数组

初始化方式1:

    int a[5][5][3]; //a[x][y][z]
	int x, y, z;
	int count = 1;

	//注意xyz的位置,根据xyz的顺序,决定for的层次;
	//顺序为xyz,循环层次为zyx;画个三维图理解一下;
	for (z = 0; z < 3; z++)
	{
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				a[x][y][z] = count++;
			}
		}
	}

	for (z = 0; z < 3; z++) //这个改变x、y、z的位置可以改变输出方式!
	{
		printf("\n第%d维度,即z=%d\n", z + 1, z);
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				printf("%d  ",a[x][y][z]);
			}
			putchar('\n');
		}
	}

初始化方式2:

step1:

step2:

step3:

    /*二维数组:a[2][3],由其本质,得:
		a[0]: {x,x,x,}
		a[1]: {x,x,x,}
	*/
	int a[5][5][3] = {
	{ { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
	{ { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
	{ { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
	{ { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
	{ { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
	};
	int x, y, z;

	for (z = 0; z < 3; z++) //这个改变x、y、z的位置可以改变输出方式!
	{
		printf("\n第%d维度,即z=%d\n", z + 1, z);
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				printf("%d  ",a[x][y][z]);
			}
			putchar('\n');
		}
	}

数组之间的相互转化

二维数组转三维数组

 二维数组    三维数组

转换原则:把一维数组以3个为单位、由睡着的扳成直立的,即为三维数组;

三维数组的xyz相互转化

设定三位数组为a[x][y][z];

例如:把a[500][500][3]转化为a[3][500][500];

    int a[5][5][3]; //a[x][y][z]
	int b[3][5][5];
	int x, y, z;
	int count = 1;
	for (z = 0; z < 3; z++)
	{
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				a[x][y][z] = count++;
			}
		}
	}

	printf("\n改变前的数组样式:-------\n");
	for (z = 0; z < 3; z++)
	{
		printf("\n第%d维度,即z=%d\n", z + 1, z);
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				printf("%3d", a[x][y][z]);
			}
			putchar('\n');
		}
	}

	printf("\n改变后的数组样式:-------\n");
	for (z = 0; z < 3; z++)
	{
		for (y = 0; y < 5; y++)
		{
			for (x = 0; x < 5; x++)
			{
				b[z][x][y]=a[x][y][z]; //和输出的方式一样,只是xyz的地位变了;
			}
		}
	}
	for (y = 0; y < 5; y++)//这个改变x、y、z的位置可以改变输出方式!
	{
		printf("\n第%d维度,即z=%d\n", y + 1, y);
		for (x = 0; x < 5; x++)
		{
			for (z = 0; z < 3; z++)
			{
				printf("%3d", b[z][x][y]);
			}
			putchar('\n');
		}
	}

 

动态一维数组 在C语言中,一维数组在定义之后,其类型和数组长度是固定不变的。但在实际的编程中往往不能确定数组的具体大小,那么在定义数组时就故意把数组长度设置的大一些,以满足数据输入的需要。这种做法经常会导致数组的利用率不高等问题,为了提高数组的利用率和希望能够实现数组的动态变化,C语言中提供了一种动态一维数组的实现方式。     通过malloc( ),calloc( ), free( )等库函数可以由我们直 阅读详情

相关推荐

(C++)动态一维数组及二维数组定义方法

(C++)动态一维数组及二维数组定义方法 动态一维数组 动态二维数组 动态数组:是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。 特点:数组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。 动态数组就可以在任何时候改变大小。在Visual B...

weixin_45789744的博客 4589

【C语言】如何动态申请一个二维数组(假设数组元素为int型)

如何动态申请二维数组(一般只有在行和列为变量时要用到)

weixin_60371270的博客 7373

任意行列二维数组C语言实现

在C语言中,数组是一个连续的线性存储结构,数组名称即为数组首元素首地址,中括号被C语言解释为指向运算,通过对指针的加法,实现取得相应元素。对二维数组的使用则相当于定义一个二阶指针,可以看做是一个一维数组里每一个成员是一个一维数组,所以二维数组的名字就是一个指向指针的指针,即二阶指针。通过两次指向运算得到相应的元素。     但是在C语言中,对变量空间的申请必须要写在一个函数的所有有效语句之前,使

Judy_c的博客 7326

动态创建二维数组的两种方法

首先来讲解一下什么是二维数组。其实二维数组也可以说是一个一维数组,只是这个一维数组比较特别,它的每一个元素都是一个一维数组。虽然二维数组在底层是按照一维数组的存储方式来存储的,即存完第一行,紧跟着存第二行,后边依次存储剩下的行。但是我们习惯上把它看做矩阵,一般也选择让他以矩阵的方式呈现在我们眼前,所以二维数组也称为矩阵。 方法1 既然二维数组也可以称为矩阵,那么我们就可以给二维数组的每一行...

半暖的博客 3万+

动态数组的使用(一维动态数组、二维、三维、N维)

之前对于不定长度的数据一直都是用链表存储的,会使用malloc和new命令,但一直没想到把最基本的数组也用动态的方式存储。 下面是用C中的malloc命令写的创建动态数组的代码: #include #include int* createarray() { int* HeadOfArray; HeadOfArray=(int*) malloc(sizeof(int)*10);//a[10]

yeze的专栏 853

landsat8数据下载教程

下载landsat数据教程

weixin_44001203的博客 1万+

简洁明了,C++中动态定义一维数组,二维数组,三维数组

#include #include #include using namespace std; int main() { int hight , row , col ; register int i , j , k ; //srand((unsigned)time(NULL)) ; //////////////////////////////////////////////////////

孟凡驰的博客 2万+

【ESP32-IDF笔记】20-配置以太网网络(W5500)

基于ESP32IDF和官方的ethernet驱动,配置W5500以太网驱动芯片,实现ESP32的有线网络

别看了,就这些信息 3471

CDQ分治详解,一维、二维、三维偏序

如何利用CDQ分治解决偏序问题

EQUINOX1的博客 5628

libnice和coturn这两个库有交叉实现的地方,具体有啥区别?

TurnAdmin:是一个TURN的管理工具,此工具能被用来管理用户账号的增删改查。 TurnServer:是TURN和STUN的服务器实现。 Turnutils_uclient: 模拟多个UDP、TCP、TLS或DTLS客户端 Turnutils_peer: 一个简单的无状态UDP-ECHO服务器,用作中继模式中的最终服务器 Turnutils_stunclient: 一个简单的STUN客户端例子 Turnutils_rfc5769check: 检查STUN/TURN协议实现的正确性。 我们..

Langeldep的专栏 1318

从T型结到Wilkinson:5分钟搞懂功分器选型指南(附最新射频测试数据对比)

本文通过对比T型结、电阻型和Wilkinson三种功分器的核心原理与实测数据,提供了清晰的射频功分器选型指南。文章结合最新的2.4GHz ISM频段测试数据,分析了插入损耗、回波损耗和端口隔离度等关键指标,并针对窄带物联网、射频测试及合成系统等不同应用场景,给出了具体的选型建议和实战提醒,帮助工程师根据系统需求做出最优决策。

bush的博客 305

C++中动态定义一维数组,二维数组,三维数组

#include<iostream> #include<ctime> using namespace std ; int main() { int hight , row , col ; register int i , j , k ; srand((unsigned)time(NULL)) ; cout<<"输入一维数组的行"<<endl; cin>>row ; //动态定义一维数组 int *p1 ; p1 = new int [

爱哭鬼 860

Java黑皮书课后题第5章:*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生

*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字题目题目概述next()读取一个字符与nextLine()读取一行破题代码 题目 题目概述 *5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字 使用Scanner类的next()方法而不是nextLine()方法来读取名字 next()读取一个字符与nextLine()读取一行 举个例子理

weixin_46356698的博客 2154

C语言动态分配二维数组

C语言动态分配二维数组 二维数组可以看成是指向数组的指针构成的数组,即指针数组,用来存放数组指针。 1、使用malloc分配二维数组时,可以先分配包含有n个指针元素的一维数组: 例如:分配具有m行n列个元素的二维数组 int **p = (int **)malloc(sizeof(int *)*n); 2、然后为每个指针元素分配数组 for(int i = 0;i < n;i++) { *(...

qq_3137614130的博客 5222

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5138

项目篇 | 图书管理系统 | 管理员模块 | 概述

图书管理系统管理员模块概述

百栗.的博客 404

C++中关于一维、二维、三维动态数组的定义

定长数组我们在这里就不讨论了,想要知道如何定义定长数组的童鞋麻烦出门直走前面左转~ 一、什么是动态数组 也就是在编译时无法确定数组长度,程序在运行时需要动态分配内存空间的数组,比如需要根据输入(cin>>n)中的n来确定的数组长度。此时,你不能这样: int arr[n];  // error: C2057: 应输入常量表达式 否则C++编译器必然会报错说len的大小不能确定,因为这种申明

东方败败的博客 2624

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

C/C++二维数组的相关总结(扩展:三维数组)

写在前面: 今天为什么要把“二维数组”这个概念重新拎出来说一说呢。原因是这样的:前几天在用c++写银行家算法的时候,resource类的成员变量有二维数组,开始写的是默认初始化的方式,类似于这种: class A { ... privated: arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; } 结果报错。所以就想重新写个成员函数用来初始化二维...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 3251

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

动态内存分配:一维、二维、三维动态数组

动态内存分配:一维、二维、三维动态数组 1.一维动态数组 1,2,3,4,5 void cpp_test1() { int *a = new int[5]; for (int i = 0; i < 5; i++) a[i] = i + 1; //print for (int i = 0; i < 5; i++) { cout << "a[" <&...

Worthy_Wang的博客 413

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言malloc函数为一维,二维,三维数组分配空间

c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区。可以根据需要,向系统申请所取空间的大小,因为没有在声明部分定义它们为变量或数组,所以不能通过变量名或数组的方式去引用这些数据,只能通过指针来引用。 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,cal

xckkcxxck的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C语言二维数组的定义、初始化、赋值

这种常规形式的数组一般使用不过二维,并且数组名很特殊,有跟指针以及地址有密不可分的关系,但是不一样,并且它使用数据的静态存储区。要使用大容量的动态内存,需要单独开辟,这里不做介绍,并且支持变量形式的申请。更多c语言数组基础知识可以翻看我之前画的博客。 先看一段代码 #include <stdio.h> int main(){ int i, j; //二维数组下标 ...

edward_zcl的博客 2万+

数组(一维、二维、三维)的动态申请及用vector 的表示方法

变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: #include using namespace std; int main() { int len; cin>>len; //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 int *p=new in

JUST DO IT 1174

JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理

​就如之前我写过的一篇文章【JNI内形参从C代码中获取返回值并返回到Java层使用】中所描述的一样,JNI编程往往需要考虑的就是如何将C/C++中计算分析得到的数据传递至Java层。传递的方式就有两种:①直接通过函数return出来;②再就是通过形参获取得到。在以上文章内介绍了int值得传递情况,这篇文章则具体讲述数组得传递方式和操作,包括一维数组、二维数组以及三维数组,数组使用到三维基本满足了绝大部分的使用需求了。

nanke_yh的博客 2395

C语言中动态分配数组

很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时候就...

吉大秦少游 13万+

c++定义动态二维数组和三维数组

c++定义动态二维数组二维指针vector 推荐使用 vector<vector<int>> array(m, vector<int>n);//定义m行n列二维数组 二维指针 二维数组本身相当于是一维数组下存储指针,可以用new int[m]定义一维数组,但是不能定义new int[m][n] //定义m行n列数组 int **array = new int ...

yanrong1095的博客 2006
上一篇: 【C功能体】三个预处理指令的简单理解
下一篇: 【C数据类型】字符数组、字符串、字符串指针
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值