c 语言数组学习

93 阅读2分钟

数组

数组一组相同类型元素的集合。

    数组类型 arr[常量表达式]; c99语法支持 变长数组 - 数组的大小是变量

d99.png

数组初始化

        int arr[5] = { 1,2,3,4,5 };// 完全初始化 1 2 3 4 5
	int arr1[5] = { 1,2,3 };// 不完全初始化 1 2 3 0 0
	int arr2[] = {1,2,3,4,5};// 不确定常量 会根据后面初始化内容多少个,来决定多少个元素
        
        // ------------------------------------------------------------------------------
        
        char ch1[5] = {'a','b','c','d'};
        char ch1[] = {'a','b','c','d'};
        数组的下标从零开始
        字符串对应当前 ASCII 的字符串
        结尾是 '\0'
        
        char ch[5] = "bit";// 'b' 'i' 't' '0' '0'
	char ch1[] = "bit";// 'b' 'i' 't' 
        
        char ch1[] = "bit";
	// [ 'b','i','t','\0']
	char ch2[] = { 'b','i','t' };// bit烫烫烫烫烫烫烫
	// ['b','i','t'] 
        // 打印到后面不知道是什么 没有遇到 \0 不会停直到在内存中找到 \0
        // 这样它们求 字符串长度也大不相同。
        printf("%d \n", strlen(ch1)); // 3 正确的字符串长度
	printf("%d \n", strlen(ch2)); // 42 随机值
        

dd22.png


int main()
{  
	int arr[10] = { 0 };
	arr[4] = 5;// [] 下标引用符
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0;i < sz;i++)
	{
		// 0 0 0 0 5 0 0 0 0 0
		printf("%d \n", arr[i]);
	}
	return 0;
};

一维数组

int main()
{   // %p 按地址的格式打印 16进制打印
	int arr[10] = { 0 };
	for (int i = 0;i < 10;i++)
	{
		printf("&arr[%d] = %p \n",i, &arr[i]);
	}
	return 0;
};

rr555.png

  1. 一维数组在内存中是连续存放
  2. 随着数组下标的增长,地址是由低到高变化
  3. 数组名是数组首元素的地址
int main()
{   
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;// 取到首个
	for (int i = 0;i < 10;i++)
	{
		printf("%d ", *p);
		// 1 2 3 4 5 6 7 8 9 10
		// 证明数组是连续的
		p++;
	}
	return 0;
};

二维数组

二维数组的创建与初始化

 
int main()
{   
	int arr[3][4];// 创建 三行四列的二维数组
	return 0;
};

// ------------------------------------------------------------

int main()
{   
	// 初始化 不完全初始化 int类型补 0 ,char 后面补 \0
	int arr1[3][4] = { 1,2,3,4,5,6 };
	// 完全初始化
	int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

	// 一行一行指定初始化
	// {}每个括号为一行 元素不够补 0
	int arr3[3][4] = { {1,2,3},{4,5,6},{7,8,9} };

	// 二维完全初始化
	int arr4[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

	// 行省略 列不可以 
	int arr5[][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

	return 0;
};

// ------------------------------------------------------------
// 二维数组打印
int main()
{   
	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

	for (int i = 0;i < 3 ;i++)
	{
		for (int j = 0;j < 4;j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
};

// ------------------------------------------------------------

int main()
{   
	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

	for (int i = 0;i < 3 ;i++)
	{
		for (int j = 0;j < 4;j++)
		{
			printf("&arr[%d][%d] = %p \n",i,j, &arr[i][j]);
		}
		printf("\n");
	}
	return 0;
};

d2255.png

  1. 二维数组在内存中也是连续存在的

  2. 一行内部连续,跨行也是连续

int main()
{   
	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
	int* p = &arr[0][0];// 拿出第一个
	for (int i = 0;i < 12 ;i++)
	{
		printf("%d ", *p);// 连续打印
		p++;// 每次向后走一位
	}
	return 0;
};

9987.png

void bob_sort(int n[],int sz)
{
	for (int i = 0;i < sz -1; i++)
	{
		for (int j = 0; j < sz - 1 -i; j++)
		{
			if (n[j] > n[j + 1])
			{
				int tp = n[j];
				n[j] = n[j + 1];
				n[j + 1] = tp;
			}
		}
	}
}
 
int main()
{   
	int arr[] = { 9 ,8,7,6,5,4,3,2,1,0};
	// 冒泡排序
	// 两两相邻的元素比较,并且可能的话需要交换
	int sz = sizeof(arr) / sizeof(arr[0]);
	bob_sort(arr, sz);

	return 0;
};

数组名是什么?

  • 数组名是首元素地址
  • 有两个意外。
  1. sizeof(数组名)数组表示整个数组,计算的是整个数组的大小单位是 byte。
  2. &数组名 数组名表示整个数组 取出的是整个数组的地址。
int main()
{   
	int arr[] = { 9 ,8,7,6,5,4,3,2,1,0};
	printf("%p \n", &arr[0]);// 首元素
	printf("%p \n", arr);// 数组
        
	printf("%p \n", &arr);// 数组地址
	return 0;
};

99d.png