C语言数组(1)

C语言数组(一)
一维数组定义
类型说明符 数组名 [常量表达式]

       举例1.
#include<stdio.h>
main(){
	int arr[10] ;
	for (int j = 0 ; j < 10 ; j++) {
		arr[j] = j;	
	}
	for (int i = 0 ; i < 10 ; i++) {
		printf("The %d number is %d .\n", i, arr[i]);
	}
}

        一维数组的初始化
(a).定义数组元素时初始化
	int arr [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
(b).只给一部分元素赋值
	int arr[10] = {1, 2, 3, 4, 5, 6};
(c).数组所有元素值相同
	int arr[10] = {1};
(d).全部元素均赋初值时可以不指定数组长度
	int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

二维数组定义
类型说明符 数组名[常量表达式][常量表达式]

        设有整型二维数组a[3][4]定义为int a[3][4]={{0, 1, 2, 3},  {4, 5, 6, 7},  {8, 9, 10, 11}};
        设数组a的首地址为1000,各下标变量的首地址及其值如图所示。
C语言数组(1)
        C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。
C语言数组(1)
        a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。
C语言数组(1)
        a[0]是第一个一维数组的数组名和首地址,因此也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],&a[0][0]是相等的。
        a[1]是第二个一维数组的数组名和首地址,因此也为1008。&a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],&a[1][0]是等同的。
        此外,&a[i]和a[i]也是等同的,在二维数组中不能把&a[i]理解为元素a[i]的地址,因为元素a[i]是不存在的。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。
        由此,我们得出:a[i],&a[i],a+i, &a[i][0]也都是等同的。
        另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。
#include<stdio.h>
main(){
    int a[3][4]={{0, 1, 2, 3},  {4, 5, 6, 7},  {8, 9, 10, 11}};
	for (int i = 0 ; i < 3 ; i++) {
		for (int j = 0 ; j < 4 ; j++) {
			printf("a[%d][%d] = %d\n", i, j, a[i][j]);
		}
	}
}

字符数组定义
char arr[5] = {'a', 'b', 'c', 'd', 'e'};
char arr2[5] = {"abcde"};

        字符数组的输入输出:单个输出(%c)和将整个数组作为字符串输出(%s)
#include<stdio.h>
main(){
	char arr[5] = {'a', 'c', 'd', 'e', 'f'};
	for (int j = 0 ; j < 5 ; j++){
		printf("%c  ", arr[j]);
	}
	printf("\n");
	printf("%s\n", arr) ;//会出现个乱码
	char arr2[] = {"abcde"};
	printf("%s\n", arr2);
	/**
		a  c  d  e  f
		acdef烫汤.	//乱码出现于此
		abcde
	*/
}

字符串
         (a).puts(字符数组名)  将字符串输出到终端
#include<stdio.h>
main(){
	char arr[5] = {'a', 'c', 'd', 'e', 'f'};
	char arr2[5] = {"acde"};	
	//若为acdef则提示错误,char arr2[] = {"acdef"};正常
	printf("%s\n", arr);	//此种输出会出现乱码
	printf("%s\n", arr2);	//正常
	puts(arr);
	puts(arr2);
}

        (b).gets(字符数组)   从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址
#include<stdio.h>
main(){	
	char arr2[10] ;	//必须指定长度,若超过数组长度则弹出报错窗口
	printf("请输入字符串:");
	gets(arr2);
	printf("您刚才的输入为:");
	puts(arr2);
	/**
		请输入字符串:HelloWorld
		您刚才的输入为:HelloWorld
	*/
}

        (c).strcat(字符数组1, 字符数组2)  连接两个字符数组中的字符串,把字符数组2接到字符数组1的后面,结果放在字符数组1中,函数调用后得到一个函数值--字符数组1的地址。
        注意:字符数组1必须足够大,以便容纳连接后的新字符串
#include<stdio.h>
#include<string.h>
main(){	
	char arr1[10] ;	//必须指定长度,若超过数组长度则弹出报错窗口
	char arr2[5];
	printf("请输入字符数组1:");
	gets(arr1);
	printf("请输入字符数组2:");
	gets(arr2);
	printf("%s\n", strcat(arr1, arr2));
	puts(arr1);
	puts(arr2);
	/**
		请输入字符数组1:hello
		请输入字符数组2:world
		helloworld
		helloworld
		world
	*/
}

        (d).strcpy(字符数组1, 字符数组2)  将字符数组2复制到字符数组1中去。
        注意:字符数组1要足够大,以便容纳复制后的值;字符数组1必须写成数组名,字符数组2可以是数组名也可以是字符串常量;不能使用=赋值,只能使用strcpy。
#include<stdio.h>
#include<string.h>
main(){	
	char arr1[10] ;	//必须指定长度,若超过数组长度则弹出报错窗口
	char arr2[10];
	char arr3[10];
	printf("请输入字符串数组1:");
	gets(arr1);
	strcpy(arr2, arr1);
	puts(arr1);
	puts(arr2);
	printf("%s\n", strcpy(arr3, "China"));
	/**
		请输入字符串数组1:hello
		hello
		hello
		China
	*/
}

        (e).strcmp(字符串1, 字符串2)
        字符串比较,字符串1 == 字符串2返回0; 字符串1 > 字符串2返回正整数;字符串1 < 字符串2返回负整数
        (f).strlen(字符数组)
        测试字符数组或字符串常量的长度
        (g).strlwr(字符串)
        将字符串大写字母转换成小写字母
        (h).strupr(字符串).
        将字符串小写字母转换成大写字母
<<To Be Continued>>