c(数组)

数组名意为首元素(下标为零的元素)地址,打印数组名就是打印首元素地址(除以下两种情况外,所有数组名都表示数组首元素的地址)

两个例外(重点):
  • sizeof(数组名),是计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
  • &数组名(如:&arr),取出的是数组(整个数组)的地址,&数组名:中数组名表示整个数组。
示例:
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,4,5,6 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);//&为取地址符
}
示例结果:003AFAF4 003AFAF4

遍历数组地址

  • 获取数组地址用%p
  • 数组在内存中的地址以十六进制形式连续存储
示例:
#include<stdio.h>
#include<string.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i;
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	for (i = 0; i < sz; i++)
	{
		printf("%p\n", &arr[i]);
	}
示例结果:

​ 00DBFD18
​ 00DBFD1C
​ 00DBFD20
​ 00DBFD24
​ 00DBFD28
​ 00DBFD2C
​ 00DBFD30
​ 00DBFD34
​ 00DBFD38
​ 00DBFD3C

二维数组

  • 二维数组的行可以省略不写,但列不能省略(如:arr[][4])

  • 二维数组在内存中的存储方式跟一维数组相同

    二维数组初始化示例:
    #include<stdio.h>
    int main()
    {
    	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };//三行四列
    }
    
冒泡排序代码示例:
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
	for (int i = 0; i < sz - 1; i++)
	{
		int flat = 1;
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp;//定义一个tmp局部变量
				//使arr[j]大于arr[j+1]时,两个数调换位置
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flat = 0;
			}
			
		}
		if (flat == 1)//当if语句没有执行时,flat为1,说明该数组已经是一个以升序排列的数组了
		{
			break;
		}
	}
}


int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };//定义一个无序数组arr
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组长度
	bubble_sort(arr,sz);//调用升序冒泡排序函数
	for (int i = 0; i < sz; i++)
	{
		printf("%d\t", arr[i]);//输出排成升序的arr数组
	}
	return 0;
}

补:

定义一个数组(如:int arr[10])

arr:是数组名

int [10]:是数组类型

如:计算数组所占空间大小用sizeof有两种方式

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));//结果:40
	printf("%d\n", sizeof(int [10]));//结果:40
	return 0;
}