Salvador del lenguaje C (matriz--5)

contenido

1.1:—Creación de arreglos dimensionales

1.2: Inicialización de arreglos

1.3: El uso de arreglos unidimensionales

2.1: Creación e inicialización de arreglos bidimensionales

2.2: El uso de arreglos bidimensionales

3.1: Matriz fuera de los límites

4.1: Clasificación de burbujas

 


1.1:—Creación de arreglos dimensionales

数组的创建方式:
  
   type_t(元素类型)   arr_name(数组名字)    [const_n](常量表达式,用来指定数组大小)


int arr[10] = {1,2,3,4,5,6,7,8,9,10};  //10个元素完全初始化
int arr2[100] = { 0 };  //100个元素全部初始化0
double arr2[10];  //十个double类型元素,没有初始化


//以下代码在VS2019编译器下不支持


int n = 10;
int arr[n];   C99中引入了变长数组的概念,允许数组的大小用变量来指定
              如果编译器不支持C99中的变长数组,那就不能使用
  

1.2: Inicialización de arreglos

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

int main()
{

int arr[10] = {1,2,3,4};  √  //不完全初始化,剩下六个元素默认初始化为0
int arr[10] = {1,2,3,4,5,6,7,8,9,10,11};  ×   //初始值的设定项太多

char ch[] = {'a','b','c'};  √   //没有指定大小,根据初始化的内容来确定大小
char ch[] = {'a','98','c'};  √  //98的ASICC码值是b



char arr1[] = "abc"   //里面存放了 a b c \0
char arr2[] = {'a','b','c'};   没有\0,长度是随机值

return 0;
}

1.3: El uso de arreglos unidimensionales

Para el uso de matrices, introdujimos un operador antes: [ ], el operador de referencia de subíndice. En realidad, es un operador para el acceso a la matriz.

Los subíndices de matriz comienzan en 0

 main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = i;
		printf("%d ", arr[i]);

    //也可以通过指针去访问数组元素

    // for (i = 0; i < sz; i++)
	// {
	//	printf("%d ", *(p + i));
	// }
    
	// }

	return 0;
}

Las matrices unidimensionales se almacenan de forma contigua en la memoria

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//打印数组的每个元素的地址
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int*p = &arr[0];


	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p <===> %p\n", i, &arr[i], p+i);
	}

	return 0;
}

2.1: Creación e inicialización de arreglos bidimensionales

int main()
{
	int arr[3][5];  //三行五列的二维数组
    char ch[5][7];  

    int arr1[3][5] = {1,2,3,4,5,6};  //不完全初始化,第一行12345,第二行60000,第三行00000
    int arr1[][5] = {1,2,3,4,5,6};  //有两行,第二行存放6,剩下补0就足够存放了



	int arr2[3][5] = { {1,2}, {4,5},{5,6} };//可以把每一行看作一维数组
    //初始化结果为{1,2,0,0,0},{4,5,0,0,0},{5,6,0,0,0}    
	 
	int arr[4][5] = { 0 }; //只是初始化了第一个元素为0,剩下元素默认为0
	return 0;
}

 Puede observarse que:

1: la matriz bidimensional no puede especificar la fila, la columna no se puede omitir y la matriz debe inicializarse al mismo tiempo.La fila determina el número de filas según el contenido de inicialización de la matriz.

2: especifique la fila y la columna, sin inicialización, la compilación también puede pasar


2.2: El uso de arreglos bidimensionales

 Las filas y columnas de la matriz bidimensional también comienzan desde el subíndice 0

int main()
{
	int arr2[][5] = { {1,2}, {4,5},{5,6} };
	int  i = 0;
	for (i = 0; i < sizeof(arr2)/sizeof(arr2[0]); i++)//0 1 2 
	{
		int j = 0;
		for (j = 0; j < sizeof(arr2[0])/sizeof(arr2[0][0]); j++)
		{
			printf("%d ", arr2[i][j]);//打印二维数组
		}
		printf("\n");
	}

	return 0;
}


int main()
{
	int arr[3][5] = { {1,2}, {4,5},{5,6} };
	int  i = 0;
	for (i = 0; i < 3; i++)//0 1 2 
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}


	return 0;
}

 Como puede ver, la dirección también se imprime continuamente

Los arreglos bidimensionales también se almacenan continuamente en la memoria. Piense en los arreglos bidimensionales como arreglos unidimensionales. El primer elemento del arreglo bidimensional es la primera fila, y el segundo elemento es la segunda fila. Cada fila puede ser considerado como un elemento, el nombre de la matriz de la primera fila de esta matriz unidimensional es arr[0]


3.1: Matriz fuera de los límites

Los subíndices de matriz tienen un alcance limitado .

La especificación inferior de la matriz está basada en 0, si la matriz tiene n elementos, el subíndice del último elemento es n-1.

Por lo tanto, si el subíndice de la matriz es menor que 0 o mayor que n-1, se accede a la matriz fuera de los límites y se excede el acceso al espacio legal de la matriz.

El lenguaje C en sí mismo no realiza una verificación fuera de los límites de los subíndices de la matriz , y el compilador no necesariamente informa un error, pero el compilador no informa un error, no significa que el programa sea correcto.

Por lo tanto, cuando los programadores escriben código, lo mejor es hacer ellos mismos las comprobaciones fuera de los límites.

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	//0~9
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);  //越界访问
	}
	
	return 0;
}

El compilador no reporta un error, pero el código está mal


4.1: Clasificación de burbujas

void bubble_sort(int* arr, int sz)
{
    //int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0, j = 0;
	for (i = 0; i < sz-1; i++)//趟数
	{
		int flag = 1;//假设有序
		for (j = 0; j < sz - i - 1; j++)//每一趟冒泡排序的过程
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (1 == flag)
		{
			break;
		}
	}
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

Pedimos el número de elementos del arreglo, pero no lo encontramos dentro de la función, porque

数组名就是数组首元素的地址
//这句话有2个例外:
//1> sizeof(数组名),数组名不是数组首元素的地址,数组名表示整个数组,计算的是整个数组的大小
//2> &数组名,数组名不是数组首元素的地址,数组名表示整个数组,取出的是整个数组的地址


试试以下代码
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	printf("%p\n", arr);
	printf("%p\n", arr+1);//+1,跳过一个整形的地址

	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);

	printf("%p\n", &arr);
	printf("%p\n", &arr+1);//+1,跳过整个数组的地址


	//printf("%d\n", sizeof(arr));//4/8
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_63543274/article/details/123331172
Recomendado
Clasificación