#4数组#

1.一维数组的创建和初始化

(1)创建

type_t   arr_name   [const_n];

//type_t 是指数组的元素类型

//const_n 是一个常量表达式,用来指定数组的大小

int arr[10]={1,2,3};//不完全初始化
char arr2[5]={'a',98}; //方块里面为常量 不能为变量
char arr3[5]="ab";//float double类型也可以
char arr4[]="abcdef";//还有\0 字符串默认有\0 单独几个字符不打\0就没有 

(2)初始化

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

(3)使用

#include <stdio.h>
int main()
{
 	int arr[10] = {0};//数组的不完全初始化
    //计算数组的元素个数
    int sz = sizeof(arr)/sizeof(arr[0]);//整个数组字节数除以一个元素的字节数 
	//对数组内容赋值 数组是使用下标来访问的 下标从0开始
	int i = 0;//当下标 
	for(i=0; i<10; i++)
	{
		arr[i] = i;
	} 
	//输出数组的内容
	for(i=0; i<10; ++i)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

数组是使用下标来访问的,下标是从0开始。

(4)存储

#include <stdio.h>
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;
}

数组在内存中是连续存放的。

2.二维数组的创建和初始化

(1)创建

int arr[3][4];

char arr[3][5];

double arr[2][4];

(2)初始化

int arr[3][4]={{1,2,3},{4,5}};//3行4列 1 2 3第一行 4 5第二行整体大括号 
char ch[5][6];//访问下标都是从0开始 
int arr[3][4]={{1,2,3,4},{5,6,7,8}};//列不能省 行可以省略 

(3)使用

#include <stdio.h>
int main()
{
    int arr[3][4]={{1,2,3},{4,5}};
    int i=0;
    for(i=0;i<3;i++)
    {
    	int j=0;
    	for(j=0;j<4;j++)
    	{
    		printf("%d ",arr[i][j]);//for循环嵌套i j走过整个数组 
		}
		printf("\n");//一行打印完换行 
	}
	//1 2 3 0
    //4 5 0 0
    //0 0 0 0
    //0 0 0 0
    return 0; 
}

(4)存储

#include <stdio.h>
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;
}

 二维数组在内存中也是连续存储的。

3.数组越界

数组的下标是有范围限制的。

数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。

所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

4.数组作为函数参数

冒泡排序

#include <stdio.h>
void bubble_sort(int arr[])
{
	int sz = sizeof(arr)/sizeof(arr[0]);
    int i = 0;
	for(i=0; i<sz-1; i++)
	{
        int j = 0;
        for(j=0; j<sz-i-1; j++)
        {
            if(arr[j] > arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    bubble_sort(arr);
    for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

这个程序在bubble_sort内部sz的大小为1 这是为什么呢?

这就涉及到数组名了

数组名是数组首元素的地址。(有两个例外)

1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。

2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。

因此当把数组名传给函数时 只会传首元素的地址 导致sz=1 从而无法实现冒泡排序

正确设计如下:

#include<stdio.h>
//双循环 外循环控制排序次数 内循环控制交换次数 
void bubble_sort(int arr[],int sz)
{
	//确定冒泡排序的趟数 n-1次
	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])//如果有序 进入循环后会直接跳出内循环进入下面if语句 最后直接跳出外循环 
			{
				int tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
				flag=0;//本趟排序的数据其实不完全有序 
			}
		} 
		if(flag==1)//简化 防止排好序后接着输出循环里的代码 
		{
			break;//跳出循环 
		}
	}
}
int main()
{
	int i=0;
	int arr[]={9,8,7,6,5,4,3,2,1,0};
	//对arr排序 排成升序 冒泡排序 相邻两个元素比较 交换 最后为升序 
	int sz=sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz);//9次冒泡排序 10个元素 实际上传递过去的数组arr首元素的地址 &arr[0] 
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0; //1sizeof (数组名)-数组名表示整个数组 整个数组大萧 
}             //2&数组名 数组名代表整个数组 &数组名 取出的是整个数组的地址
 //3&arr不要认为是第一个元素的地址 打印结果一样 但含义不同 如果加1 加4*元素个数 

sz也作为一个参数传过去

#4数组#完

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小恒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值