C语言数组
C语言数组:
数组的简介:
一般格式:类型 数组名[数组下标]
例如:int a[10];
1:数组属于构造类型。他是基本数据类型元素的组合。
2:一个数组中的成员在内存上是连续的。
3:a:代表数组名,他同时又代表数组的首地址。
a是一个常量。(不可以自加,自减 a++,--a等操作),可以进行 a+1 的操作(因为没有赋值) 。
4:[ ]:数组的格式,10数组的成员有十个。
a[0], a[1] .................. a[9]
5:编译器不对数组越界检查(一定要注意越界问题)
a[-1] 不会出错
a[10] 不会出错
数组赋值的使用:
1、定义的时候直接赋值初始化:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int a[10] = {1,2,3,4,5};
a[0]----a[4] 里面的值是1,2,3,4,5
a[5]----a[9] 这里面的值都是0
int a[10] = {0}; 数组中的成员都是0
int a[ ] = {1,2,3,4,5}; 这里a没指定数组的成员个数,但是初始化的时候给了4个处理,编译器就会给他4个int 类型的大小。
对于字符数组也可以这样初始化:
char a[5] = " 'a' , 'b' , 'c' , 'd' , 'e' ";
char b[5] = " abcd " ; //注:这样给数组赋值时,尽量把最后一个位置空出来,用于存放字符串的结束符 (‘ \0 ’)
char c[ ] = " ajnj564 " ;
也可以先定义一个数组,然后在一个一个的赋值。
int a[5];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
数组的排序问题:
(1)、冒泡排序:
拿相邻的两个数比较,如果前面的数字大,就将这两个数进行交换,否则不交换。
n个数, 需要比较(n-1)趟
趟:i=0 =====> i < n-1
每一趟比较的次数是(n-1-i)【 i是趟数 (趟数是从0开始的)】
点击查看代码
#include <stdio.h>
#define N 5
int main()
{
int a[ N];
int i , j ;
int temp;
printf("请输入5个整数:");
for(i = 0; i < N; i++)
{
scanf("%d",&a[ i ] );
}
for(i=0; i < N; i++)
{
printf("a[%d] = %d\n", i , a[i]); //按原顺序打印数组中的元素(也可以封装成一个函数)
}
for(i=0; i < N; i++)
{
for(j = 0; j<N-1-i; j++)
{
if(a[ j ] > a[j + 1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(i=0; i < N; i++)
{
printf("a[%d] = %d\n", i , a[i]); //按排序后的顺序打印数组中的元素(也可以封装成一个函数)
}
return 0;
}
(2)选择排序
从数组中随便选择一个数,和数组中的其他成员挨个比较。如果这个数比数组中的某个数小,就和他交换数据。
注:这个随便选择的数据一般是第一个数据。
点击查看代码
#include <stdio.h>
#define N 5
int a[N];
void show_data() //打印数组元素
{
int i;
for(i=0; i<N; i++){
printf("%d\t",a[i]);
}
puts("");
}
void input_data() //对数组元素赋值
{
int i;
for(i=0; i<N; i++){
printf("please input %d number > ",i+1);
scanf("%d",&a[i]);
}
}
void selection_sort() //利用 选择排序 对数组元素进行排序。
{
int i,j,temp;
for(i=0; i<N; i++){
for(j=i+1; j<=N; j++){
if(a[i] > a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
int main(int argc, const char *argv[])
{
input_data();
printf("selection sort before\n");
show_data();
selection_sort();
printf("selection sort after\n");
show_data();
return 0;
}
总体思想:对于一个数组,我们从中间任意选择一个数据,把这个数组,从这个从选择的这个数据的两边分成两部分。
然后对于划分的两部分再分别从中间任意选择一个值,同样的方法进行分成两部分。
这样无限制的递归下去,到最后只剩下一个数据的时候就排序完成了。
然后再把排序好的数据规整到一起即可。


点击查看代码
#include <stdio.h>
#define N 6
int Arr[N] = {0};
int i=0, j=0;
void show_Arr_num(int *arr_show){
for(i=0; i<N; i++){
fprintf(stderr, "Arr[%d] = %d \n", i, arr_show[i]);
}
}
void Arr_sort_func(int *Arr_sort, int begin, int end){
if(begin < end){
int tmp = Arr_sort[begin];
int x = begin;
int y = end;
while(x<y){
while(x<y && Arr_sort[y]>tmp){
y--;
}
Arr_sort[x] = Arr_sort[y];
while(x<y && Arr_sort[x]<tmp){
x++;
}
Arr_sort[y] = Arr_sort[x];
}
Arr_sort[x] = tmp;
Arr_sort_func(Arr_sort,begin,x-1);
Arr_sort_func(Arr_sort,x+1,end);
}
}
int main(int argc, char *argv[])
{
fprintf(stderr, "Please input six integers > ");
for(i=0; i<N; i++){
scanf("%d", &Arr[i]);
}
show_Arr_num(Arr);
fprintf(stderr, "************\n");
//Arrary sort
Arr_sort_func(Arr,0,5);
show_Arr_num(Arr);
return 0;
}
//执行结果:
//ubuntu@linux:~$ ./a.out
//Arr[0] = 23
//Arr[1] = 89
//Arr[2] = 16
//Arr[3] = 39
//Arr[4] = 47
//Arr[5] = 67
//************
//Arr[0] = 16
//Arr[1] = 23
//Arr[2] = 39
//Arr[3] = 47
//Arr[4] = 67
//Arr[5] = 89
二维数组:
访问数组的实质:
一维数组:a[] =====> * (a+i)
二维数组:a[][] =====> (*(a+i))[j]
二维数组简介:
1、二维数组的一般形式:
类型说明符 数组名[常量表达式1][常量表达式2];
二维数组分行和列,a[行][列],二维数组是一个大数组里包含了N个小数组,每个小数组里都包含了M个元素,这个N就是行,M就是列
a[][4]={{1,2,0,0},{3,0,0,0},{4,5,6,7}};
int b[5];
行能省略,列不能省略
a、二维数组在内存上存储也是连续的
b、二维数组的数组名也是常量,也不允许进行自加,自减操作。
c、在定义数组时,行下标可以省略,列下标一定不能省略。
2、二维数组的初始化:
int a[4][3] = {1,2,3,4,5,6};
int a[4][3] = {{1,2},{3,4},{5,6}};
int a[ ][2] = {{1,2},{3,4},{5,6}};
int a[3][ ] = {{1,2},{3,4},{5,6}}; //错误的
点击查看代码
//:将一个二维数组中的最大的数的下标打印出来。
int main()
{
int arr[4][3] = {10,30,-10,1,2,3,60,80,9,10,11,13};
int i, j ,k=0, w=0;
for(i=0;i<4;i++) //循环的是行
{
for(j=0;j<3;j++) //循环的是列
{
if(arr[k][w]<a[i][j])
{
k=i;
w=j;
}
}
}
printf("数组arr中最大的那个元素的:行下表 = %d , 列下标 = %d",k,w);
}
3、二维字符数组
char a[10][10] = {"hello","hello"};
char a[ ][10] = {"hello","hello"};
char a[10][10] = {'h','e','l','l','o','h','a','l','l','o'};

浙公网安备 33010602011771号