一、数组

1.1 数组的概念

  • 数组:一片连续的相同类型变量的内存空间。
  • 数组成员:元素可以是任意类型。

二、 一维数组

2.1 一维数组的定义

一般形式是:数据类型 数组名[数组元素个数]

  • 数组名字符合标识符的书写规定(数字、英文字母、下划线)
  • 数组名不能与其它变量名相同,同一作用域是唯一的
  • 数组定义时[]内最好是常量,使用数组时[]内即可是常量,也可以是变量(定义时最好不要写变量)
  • 数组元素的个数在定义时可以不写,但是如果不写,定义的时候必须赋值
  • 如果没有给定初始值,默认是随机数

2.2 一维数组的初始化

#include <stdio.h>
int main()
{
    //int a[4];
    //如果不初始化,直接使用会是随机值
    
    //int a[4] = {123, 78, 666, 476};
    //初始化方式1:全部初始化
    
    //int a[] = {10, 20, 30, 40};
    //如果是全部 初始化,可以不指定数组元素的个数,系统会自动分配
    

    //初始化方式2:局部初始化
    //未初始化的位置的元素自动赋值为0
    int a[3] = { 1, 2 };

    printf("%d\n", a[0]);
    printf("%d\n", a[1]);
    printf("%d\n", a[2]);
    return 0;
}

2.3 强化练习

2.3.1 求数组最大和位置

#include<stdio.h>
int main()
{
	printf("输入10个数字\n");
	int i, max = 0, a[10];
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &a[i]);
	}
	for (i = 0; i < 10; i++)
	{
		if (a[i] > a[max])
		{
			max = i;
		}
	}
	printf("第%d位最大为%d\n", max + 1,a[max]);
	return 0;
}

2.3.2 数组倒置

#include<stdio.h>
int main()
{
	printf("输入10个数字\n");
	int i,a[10],b[10];
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &a[i]);
	}
	for (i = 0; i < 10; i++)
	{
		b[9 - i] = a[i];
	}
	for (i = 0; i < 10; i++)
	{
		a[i] = b[i];
		printf("%d\n", a[i]);
	}
	return 0;
}

2.3.3 冒泡排序

#include<stdio.h>
int main()
{
	printf("输入10个数字\n");
	int i,j,max = 0, a[10];
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &a[i]);
	}
	for (i = 0; i < 9; i++)
	{
		for (j = i+1; j < 10; j++)
		{
			if (a[i] > a[j])
			{
				max=a[i];
				a[i] = a[j];
				a[j] = max;
			}
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", a[i]);
	}
	return 0;
}

三、二维数组

3.1 二维数组的定义

一般形式是:类型说明符 数组名[常量表达式1][常量表达式2]

  • 二维数组的下标也是可以省略的,但是在初始化时行数可以省略,但是列数不能省略。
#include <stdio.h>
int main()
{
    //int a[2][3];    
    //二维数组的初始化

    //int a[2][3] = {{10, 20, 30}, {40, 50, 60}};
    //初始化方式1:按行初始化
    //全部初始化

    //int a[2][3] = {{10, 20}, {30}};    
    //局部初始化
    //没有赋值的位置的元素自动为0

    //int a[2][3] = {1, 2, 3, 4, 5, 6};
    //初始化方式2:逐个初始化
    //全部初始化

    //局部初始化
    //没有赋值的位置的元素自动为0
    int a[2][3] = { 1, 2, 3 };

    printf("%d\n", a[0][0]);
    printf("%d\n", a[0][1]);
    printf("%d\n", a[0][2]);
    printf("%d\n", a[1][0]);
    printf("%d\n", a[1][1]);
    printf("%d\n", a[1][2]);

    return 0;
}

3.2 数组名

数组名代表第一个元素的首地址,是常量,不能赋值。

3.3 多维数组

多维数组的定义与二维数组类似,其语法格式具体如下:

数组类型修饰符 数组名 [n1][n2]~[nn]

四、字符数组

4.1 字符数组的定义

  • 字符串是特殊的字符数组,字符串有结尾符\0
  • 0和'\n'一样,字符可以理解成8为整数
  • 使用字符串初始化,编译器自动在后面补0
  • \0后面最好不要连着数字,又可能几个数字连起来刚好是一个转义字符
#include <stdio.h>
int main()
{
    //1.普通字符组
    char cl[] = { 'c',' ','p','r','o','g' };
    printf("c1=%s\n", cl);//printf()输出%s字符串时,会访问到\0为止。定义字符数组时,没有指定结尾符\0,则输出乱码。
    
    //2.以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串
    char c2[] = { 'c',' ','p','r','o','g','\0' };
    printf("c1=%s\n", c2);
    
    char c3[10] = { 'c',' ','p','r','o','g','\0' };//其他默认数组元素是\0
    printf("c1=%s\n", c3);
    return 0;
}

4.2 字符串的输入

  • 输入scanf 输出printf
#include <stdio.h>
int main()
{
    char str[100];
    printf("input:");
    scanf_s("%s", str);//scanf遇到空格结束输入
    printf("output:%s\n", str);
    return 0;
}
  • 输入gets
#include <stdio.h>
int main()
{
    char str[100];
    printf("input:");
    gets_s(str);//gets遇到换行字符结束输入
    printf("output:%s\n", str);
    return 0;
}
  • 输入fgets
#include <stdio.h>
int main()
{
    char str[100];
    printf("input:");
    fgets(str,100,stdin);//fgets从文件stdin(标准输入/键盘输入)输入,存储到str中,并且可以指定接收的最大的大小
    printf("output:%s\n", str);
    return 0;
}

4.3 字符串的输出

  • 输出puts
#include <stdio.h>
int main()
{
    printf("hello world\n");
    puts("hello world\n");//自动在结尾加换行
    return 0;
}
  • 输出fputs
#include <stdio.h>
int main()
{
    printf("hello world\n");
    fputs("hello world\n",stdout);//fputs向stdout(标准输出/屏幕输出)写字符串;不会自动加\n.
    return 0;
}

4.4 求字符串长度strlen

#include <stdio.h>
#include<string.h>
int main()
{
    char str[] = "hello\0world";
    int len = strlen(str);
    printf("strlen(str)=%d\n",strlen(str));
    return 0;
}