一、数组
概念:由同种数据类型的若干个数据组成的集合;
1、数据类型相同
2、内存连续
定义:存储类型 数据类型 数组名[元素个数];
存储类型:auto register extern static
数据类型:数组元素的数据类型
元素个数:必须是确定的数
eg: int a[10];
注: 数组名不能和变量名重名;
数组元素:数组名[下标];下标从0开始;
数组名是数组的首地址,是地址常量,不能作为左值
数组的初始化
注:数组如果是局部变量,没有被初始化,其元素的值为随机值
数组如果是全局变量,没有被初始化,其元素的值为0
数组如果是被static修饰局部变量,没有被初始化,其元素的值为0
(1)满数初始化
int a[5]={1,2,3,4,5};
满数初始化时,元素个数可以省略
(2)部分赋值
int a[5]={1,3,3};
a[0]=1 , a[1]=2 , a[2]=3 , a[3]=0 , a[4]=0;
部分赋值时,其他没有被初始化的元素的值都为0,元素个数不能省略
(3)赋值为0
int a[5] = {0};
memset(a , 0 , sizeof(a))
bzero(a , sizeof(a))
字符数组的初始化
(1)满数初始化
char a[5] = {'a' , 'b' , 'c' , 'd' , '\0' };
char a[5] = "abcd";
(2)部分赋值
char a[5] = { 'a' , ' b' };
char a[5] = "ab";
数组的赋值
int a [10];
a = {1,2,3,4,5,6,7,8,9,0}; //error a是数组的首地址,是地址常量
a[10] = {1,2,3,4,5,6,7,8,9,0}; //error 数组a的下标是从0~9,a[10]不存在,并且a[10]是数组元素
打印地址:%p
求数组元素的个数:sizeof(数组名)/sizeof(数据类型)
三、二维数组
定义:存储类型 数据类型 数组名[行][列];
int a[2][3];
二维数组在内存中是一维的,并且是按行存储的;
二维数组的初始化:
1、满数初始化
int a [ 2 ][ 3 ] = { {1,2,3} , {4,5,6}};
int a [ 2 ][ 3 ] = {1,2,3,4,5,6};
满数初始化时,行号可以省略,但是列号不能省略
2、部分初始化
int a[ 2 ][ 3 ] = { {1,2 } , { 4 } };
字符二维数组
char a[ 2 ][ 10 ] = { {'a','b','c','d','\0'},{'e','f','g','h','\0'}};
char a[ 2 ][ 5 ] = {"abcd","efgh"};
四、字符串函数
1、strlen:功能:求字符串长度,不包含’\0‘
原型:size_t strlen(const char *s);
其中:参数s为所求字符串的首地址
返回值:字符串s的长度
2、strcat(字符数组1,字符串2);
功能:把字符串2连接到字符串1后面,字符串1的'\0'没有了
strncat(字符数组1,字符串2,n);
功能:把字符串2的前几个字符连接到字符串1后面
3、strcpy(字符数组1,字符串2);
功能:把字符串2拷贝到字符数组1当中去
注意:在拷贝时,连同 '\0' 一同拷贝,属于完全拷贝
strncpy(字符数组1,字符串2,n);
功能:把字符串2的前n个字符拷贝到字符数组1当中去,字符数组1的其他字符保持不变
不管strcat还是strcpy 要注意:字符数组1要足够大
4、strcmp:字符串比较函数
比较规则:对两个字符串从左至右,逐个字符进行比较(ASCLL),直到遇到不同的字符或者'\0'为止
int strcmp(字符串1,字符串2);
返回值:比较结果
a、>0 字符串1>字符串2
b、==0 字符串1=字符串2
c、<0 字符串<字符串2
int strncmp(字符串1,字符串2, n);
比较规则:对两个字符串从左至右,逐个字符进行比较(ASCLL),直到遇到不同的字符或者'\0'为止
返回值:比较结果
a、>0 字符串1>字符串2
b、==0 字符串1=字符串2
c、<0 字符串<字符串2
概念:由同种数据类型的若干个数据组成的集合;
1、数据类型相同
2、内存连续
定义:存储类型 数据类型 数组名[元素个数];
存储类型:auto register extern static
数据类型:数组元素的数据类型
元素个数:必须是确定的数
eg: int a[10];
注: 数组名不能和变量名重名;
数组元素:数组名[下标];下标从0开始;
数组名是数组的首地址,是地址常量,不能作为左值
数组的初始化
注:数组如果是局部变量,没有被初始化,其元素的值为随机值
数组如果是全局变量,没有被初始化,其元素的值为0
数组如果是被static修饰局部变量,没有被初始化,其元素的值为0
(1)满数初始化
int a[5]={1,2,3,4,5};
满数初始化时,元素个数可以省略
(2)部分赋值
int a[5]={1,3,3};
a[0]=1 , a[1]=2 , a[2]=3 , a[3]=0 , a[4]=0;
部分赋值时,其他没有被初始化的元素的值都为0,元素个数不能省略
(3)赋值为0
int a[5] = {0};
memset(a , 0 , sizeof(a))
bzero(a , sizeof(a))
字符数组的初始化
(1)满数初始化
char a[5] = {'a' , 'b' , 'c' , 'd' , '\0' };
char a[5] = "abcd";
(2)部分赋值
char a[5] = { 'a' , ' b' };
char a[5] = "ab";
数组的赋值
int a [10];
a = {1,2,3,4,5,6,7,8,9,0}; //error a是数组的首地址,是地址常量
a[10] = {1,2,3,4,5,6,7,8,9,0}; //error 数组a的下标是从0~9,a[10]不存在,并且a[10]是数组元素
打印地址:%p
求数组元素的个数:sizeof(数组名)/sizeof(数据类型)
或者sizeof(数组名)/sizeof(a[0])
二、冒泡排序
100 28 78 0 12
第一趟:
第一次:28 100
第二次: 78 100
第三次: 0 100
第四次: 12 100
28 78 0 12 100
第二趟:
第一次:28 78
第二次: 0 78
第三次: 12 78
28 0 12 78 100
第三趟:
第一次:0 28
第二次: 12 28
0 12 28 78 100
第四趟:
第一次:0 12
最终结果:0 12 28 78 100
#include<stdio.h>
#include<stdbool.h>
int main()
{
int num[10]={8,9,7,6,0,2,4,1,45,34};
int i,j,temp;
bool flag = true;
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(num[j]>num[j+1])
{
flag = false;
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
if(true == flag)
{
break;
}
}
for(i=0;i<10;i++)
{
printf("%5d",num[i]);
}
printf("\n");
return 0;
}
选择排序
#include<stdio.h>
int main()
{
int num[10];
printf("input 10 numbers\n");
int i,j,min,temp;
for(i=0;i<10;i++)
{
scanf("%d",&num[i]);
}
for(i=0;i<9;i++)
{
min = i;
for(j=i+1;j<10;j++)
{
if(num[j]<num[min])
{
min = j;
}
}
if(min!=i)
{
temp = num[min];
num[min] = num[i];
num[i] = temp;
}
}
for(i=0;i<10;i++)
{
printf("%5d",num[i]);
}
printf("\n");
return 0;
}
三、二维数组
定义:存储类型 数据类型 数组名[行][列];
int a[2][3];
二维数组在内存中是一维的,并且是按行存储的;
二维数组的初始化:
1、满数初始化
int a [ 2 ][ 3 ] = { {1,2,3} , {4,5,6}};
int a [ 2 ][ 3 ] = {1,2,3,4,5,6};
满数初始化时,行号可以省略,但是列号不能省略
2、部分初始化
int a[ 2 ][ 3 ] = { {1,2 } , { 4 } };
字符二维数组
char a[ 2 ][ 10 ] = { {'a','b','c','d','\0'},{'e','f','g','h','\0'}};
char a[ 2 ][ 5 ] = {"abcd","efgh"};
四、字符串函数
1、strlen:功能:求字符串长度,不包含’\0‘
原型:size_t strlen(const char *s);
其中:参数s为所求字符串的首地址
返回值:字符串s的长度
2、strcat(字符数组1,字符串2);
功能:把字符串2连接到字符串1后面,字符串1的'\0'没有了
strncat(字符数组1,字符串2,n);
功能:把字符串2的前几个字符连接到字符串1后面
3、strcpy(字符数组1,字符串2);
功能:把字符串2拷贝到字符数组1当中去
注意:在拷贝时,连同 '\0' 一同拷贝,属于完全拷贝
strncpy(字符数组1,字符串2,n);
功能:把字符串2的前n个字符拷贝到字符数组1当中去,字符数组1的其他字符保持不变
不管strcat还是strcpy 要注意:字符数组1要足够大
4、strcmp:字符串比较函数
比较规则:对两个字符串从左至右,逐个字符进行比较(ASCLL),直到遇到不同的字符或者'\0'为止
int strcmp(字符串1,字符串2);
返回值:比较结果
a、>0 字符串1>字符串2
b、==0 字符串1=字符串2
c、<0 字符串<字符串2
int strncmp(字符串1,字符串2, n);
比较规则:对两个字符串从左至右,逐个字符进行比较(ASCLL),直到遇到不同的字符或者'\0'为止
返回值:比较结果
a、>0 字符串1>字符串2
b、==0 字符串1=字符串2
c、<0 字符串<字符串2