计算机基础

数组的分配和访问

3.8 数组分配和访问

C语言中的数组是一种将标量数据聚集成更大数据类型的方式。

3.8.1 基本原则

对于数据类型T和整型常数N,声明如下: T A[N];

它有两个效果:

  • 在存储器中分配一个L*N字节的连续区域,这里的L是数据类型T的大小。
  • 其次,引入了标识符A,A可以作为指向数组开头的指针,和A[0]的地址一样。

3.8.2 指针运算

指针p的值为xp,那么表达式xp + i的值为xp + L*i,这里的L是数据类型的大小。

3.8.3 嵌套数组

int A[5][3]等价于:

typedef int row3_t[3];
row3_t A[5];
// 5行3列,一行3个,5行

嵌套数组也是线性存储,元素的地址,从左到右,从上到下递增。 行|元素|地址 —|—|— A[0]|A[0][0]|Xa A[0]|A[0][1]|Xa + 4 A[0]|A[0][2]|Xa + 8 A[1]|A[1][0]|Xa + 12 A[1]|A[1][1]|Xa + 16 A[1]|A[1][2]|Xa + 20 A[2]|A[2][0]|Xa + 24 A[2]|A[2][1]|Xa + 30 A[2]|A[2][2]|Xa + 36 …|…|…

3.8.4 定长数组

#define N 16
typedef int fix_matrix[N][N];
/**
 *求矩阵乘积中第i行第k列 元素的值 A[i][0] * B[0][k] + A[i][1] * B[1][k] +...  
 *
 */
int fix_prod_ele(fix_matrix A, fix_matrix B, int i, int k){
	int j = 0;
	int result = 0;
	for(j = 0; j < N; j++){

		result += A[i][j] * B[j][k];
	}
	return result;
}

// 优化

int fix_prod_ele_opt(fix_matrix A, fix_matrix B, int i, int k){
	int * Arow = &A[i][0]; // 第i行第0个元素的地址
	int * Bptr = &B[0][k]; // 第0行第k个元素的地址
	int j;
	int result = 0;
	for(j = 0; j != N; j++){

		result += Arow[j] * (*Bptr);
		Bptr += N;
	}
	return result;

3.8.5 变长数组

#include <stdio.h>

/**
 * 参数m,n必须在参数A[m][n]之前, 名称也必须是m,n 这样函数就可以在遇到这个数组的时候计算数组的维度
 */
int var_ele(int m, int n, int a[m][n], int i, int j){

	return a[i][j];
}

int main(){
	int arr[3][2] = {
		{1, 2},
		{4, 5},
		{6, 7}
		};

	printf("%d\n", var_ele(3, 2, arr, 1, 1));
}

关于作者

程序员,软件工程师,java, golang, rust, c, python,vue, Springboot, mybatis, mysql,elasticsearch, docker, maven, gcc, linux, ubuntu, centos, axum,llm, paddlepaddle, onlyoffice,minio,银河麒麟,中科方德,rpm