0
点赞
收藏
分享

微信扫一扫

一、二维数组

潇湘落木life 2022-03-14 阅读 118

数组

 

数组的创建和初始化

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

数组的【】中要给一个常量

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};

arr1占4个字节,arr2占3个字节

一维数组在内存中的存储

int main()
{
 int arr[10] = {0};
 int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    
 for(i=0; i<sz; ++i)
 {
 printf("&arr[%d] = %p\n", i, &arr[i]);
 }
 return 0; }

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。

每次增加4个字节,16进制只是一个地址名字没有意义;实际上1个16进制=0.5个字节;

在地址计算中拿字节算

 全局变量不初始化时默认值为0

 递归时可以通过改变str+1,来确定新的字符个数strlen(arr+1)

二维数组初始化和创建

    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");
	}

当初始化没有用花括号括起来时默认一个一个放

二维数组在初始化时 行一定要写值;二维数组可以看成多个一维数组组成,一维数组占每一行;三维数组也可以看成多个二维数组(长宽高)

 

 

 

特殊表达方式

二维数组在内存中的存储

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

数组作为函数参数

例题:冒泡排序

void bubble_sort(int* arr, int sz)
{	
	//趟数
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		int flag = 1;//假设已经有序
		//每一趟冒泡排序过程
		int j = 0;
		for (j = 0; j < sz-1-i; 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[] = { 3,1,5,2,4,9,8,6,0,7 };
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//写一个冒泡排序的函数,来排序arr数组的内容
	//arr-表示的首元素的地址
	//&arr[0]
	//
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

 每走完一趟少一个

数组名是首元素地址,可以通过数组名来访问剩下元素方法是arr+1. 解引用一下

因此在数组作为参数传递过去时,要用指针来存储数组,所以在计算数组元素时要提前在主函数中算好,因为指针的内存只与64位还是32位系统有关,char,int类型指针在32位都是4个字节。

数组名

数组名是首元素地址,除了以下两种情况。

数组名本身就是地址,再加个&就变成整个数组地址

底层:0C+28=34;28十进制换16进制=2*16+8=40; 4十进制换16进制=4;加的是十进制数

外层:arr+1,1是一个整型表示4个字节

举报

相关推荐

0 条评论