其他分享
首页 > 其他分享> > C语言初阶-数组

C语言初阶-数组

作者:互联网

C语言初阶之数组

前言

本文主要介绍C语言中的数组,很高兴和大家一起学习。

一、一维数组的创建和初始化

1.数组的创建

数组是一组相同相同类型元素的集合。数组的创建方式有:

typy_name   arr_name   [const_n];
//typy_name是数组的元素类型
//arr_name是一个常量表达式,用来指定数组的大小

数组创建的实例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr1[10];
	//创建一个数组,整型存放10个
    char arr2[10];
    int n=10
    char arr3[n];
	//错误!![ ] 内必须是常量或常量表达式,不能使用变量
    return 0;
}

注:数组创建,[ ]中要给一个常量才可以,不能使用变量。

2.数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。

int main()
{
int arr1[10] = {1, 2, 3};
//不完全初始化,剩下的元素默认初始化为0
//[ ]里的数字可以不写,会根据初始化内容自动判定数组长度
//[ ]写数字的话,{ }内不能超过数组长度

char arr2[5] = {"a","b"};
char arr3[5] = "ab";
//打印结果相同,但是后者还包括了" \0 "

char *p = "abc";
//这里不展开讲'指向数组的指针'的相关概念
return 0;
}

大家可以使用sizeof看一下arr2和arr3各自的长度,是不一样的。

这里补充一些知识:sizeof与strlen没有什么关联:

  1. strlen是求字符串长度的,它只能针对字符串求长度,还因为它是库函数,使用的话需要头文件。

  2. sizeof是操作符,可以计算变量、数组、类型的大小,单位是字节

3.一维数组的使用

关于数组的使用,我们之前已经见过了一个操作符:[ ],下标引用操作符,它其实就是数组访问的操作符。

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char arr[10] = "abcdef";
    int i = 0;
    for ( i = 0; i < 10; i++ )
	//不能写成i<11 ,不可以越界访问
    {
        printf("%c   ",arr[i]);
    }
    //数组是使用下标来访问的,下标从0开始
    return 0;
}

4.一维数组在内存中的存储

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int s = sizeof(arr)/sizeof(arr[0]);
	for (i = 0; i < s; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}

	return 0;
}

运行结果:

image

数组在内存中是由低到高并且是连续存放的。

二、二维数组的创建和初始化

1.数组的创建

int arr[3][4] ;
char arr[2][4] ;
double arr[3][2] ;

2.数组的初始化

//第一个[ ]是行 ; 第二个[ ]是列
int arr[3][4] = { 1, 2, 3, 4, 5};
//因为数组是4列,1234在一行,5被放到了第二行
int arr[3][4] = {{1,2},{4,5}};
int arr[][3] = {{1,2},{4,5}};
//当一行中有元素没有初始化的时候,默认为0
int arr[1][4] = {{1,2},{4,5}};//错误示例:超出了数组范围
int arr[3][] = {{1,2},{4,5}};//错误示例:行可以省略,但列不能省略掉

3.二维数组的使用

二维数组的使用也是通过下标的方式

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int arr[3][4] = {{1,2,3},{4,5}};
	int i = 0;
	int j = 0;

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

	return 0;
}

4.二维数组在内存中的存储

我们在这里打印二维数组的每个元素,来观察它是如何存储的

#include <stdio.h>
#include <stdlib.h>

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

运行结果:

image

从这里我们可以看出,二维数组的元素也是连续存放的。

补充:

举个栗子: int arr [3] [4];
我们可以用arr[0]arr[1]arr[2]的方式访问数组
arr[0]就是arr[0][j]
arr[1]就是arr[1][j]
arr[2]就是arr[2][j]

三、数组作为函数参数

在我们在写代码的时候,往往会将数组作为参数传给函数。

例:冒泡排序函数将一个整形数组排序

补充:冒泡排序(此例子为升序):两两相邻的元素进行比较
10,9,8,7,6,5,4,3,2,1
9,10,8,7,6,5,4,3,2,1
9,8,10,7,6,5,4,3,2,1
9,8,7,10,6,5,4,3,2,1
...
9,8,7,6,5,4,3,2,1,10
这是一趟冒泡排序,然后以此类推,再从开始两两数字相比较
10个元素,所以要进行9趟冒泡排序
最后的结果就是1,2,3,4,5,6,7,8,9,10
#include <stdio.h>
#include <stdlib.h>

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])
           {
            int tmp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = tmp;
            flag = 0;//本套排序的数字其实不完全有序
           }
       }
           if(flag == 1)
             {
               break;
             }
    }
}

int main()
{
    int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    //对arr进行排序,排成升序
    //arr是数组,我们对数组arr传参,实际上传递过去的是数组arr的首元素的地址
    bubble_sort(arr,sz);//冒泡排序函数
    for(i = 0;i<sz;i++)
    {
        printf("%d",arr[i]);
    }
    return 0;
}


注意:
1.数组作为函数参数时,不会把整个数组传递过去,实际上只是把数组的首元素的地址传递过去了。

2.数组名就是数组首元素的地址(有两个除外)
1)sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
2)&数组名,取出的是数组的地址,&数组名表示的是整个数组

结尾

以梦为马,不负韶华。

标签:10,arr,初阶,int,C语言,数组,sizeof,include
来源: https://www.cnblogs.com/yjlin/p/16101513.html