day05
[1] 计算字符串实际元素个数
char a[33]="hello world";
int i;
for(i=0;a[i]!='\0';i++)
{
printf("%d\n",i); //11
}
strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际元素个数 不包括'\0'
参数:字符数组首地址
返回值:字符串实际元素个数
int num=strlen(a);
printf("%d\n",num);//5
或
printf("%d\n",strlen(a));//5
练习 :将一串字符串进行倒置char buf[32]=”hello”;//olleh
思路一:h<-->o e<-->l
sizeof和strlen的区别:
- sizeof是关键字,strlen是函数
- sizeof计算元素实际开辟的空间大小,strlen计算字符串实际元素个数;sizeof计算包括'\0',strlen不包括'\0'
- char a[ ]="hello"; sizeof(a)==6 strlen(a)==5
判断:
char s[10]="hello";
以下几种赋值方式:
- s[10]="hello";
//只有在定义数组时,[ ]里表示元素个数,其他情况下,[ ]里表示索引
- s="hello";
//数组名也是数组首地址,是一个地址常量,不能被修改
- strcpy(s,"world");
D
[2] 冒泡排序
5个数,比较4轮
int a[5]={6,5,4,3,2}; //从小到大
第一轮:
56432
54632
54362
54326
第二轮:
45326
43526
43256
第三轮:
34256
32456
第四轮:
23456
//从小到大排 确保右边是大的值
int a[5]={6,5,4,3,2},temp;
for(int i=0;i<5-1;i++) //轮数 5个数比较4轮
{
for(int j=0;j<5-1-i;j++) //每一轮比较的次数
{
if(a[j]>a[j+1]) //确定了最大或最小值之后,这个值被固定到最右边,之后不参与比较,所以随着循环的执行,参与比较的元素越来越少,它的索引越来越低
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<5;i++)
printf("%d ",a[i]);
[3] 选择排序
假设第一个元素最小,和后边每一个进行比较,比较过程中遇到了更小值,暂存下标位置,直到一轮比较结束,再把最小值和最左边位置交换;
6 5 4 3 2
int a[5]={6,5,4,3,2},m,temp;
for(int i=0;i<5-1;i++) //轮数
{
m=i; //m:最小元素下标 ,默认是参与比较的元素中最左边位置
for(int j=i+1;j<5;j++) //获取剩下的所有元素
{
if(a[m]>a[j])
{
m=j; //在循环内部,暂存最小元素下标
}
} //一轮循环结束,交换位置
//交换
if(m!=i) //当最小元素下标==要交换位置的下标,不需要交换
{
temp=a[m];
a[m]=a[i];
a[i]=temp;
}
}
for(int i=0;i<5;i++)
printf("%d ",a[i]);
[4]二维数组
格式:
数据类型 数组名[行数][列数];
int a[2][3]={2,3,4,5,6,7};
访问: 数组名[行下标][列下标] 下标从0开始
a[0][0] | a[0][1] | a[0][2] |
a[1][0] | a[1][1] | a[1][2] |
int a[2][3]={2,3,4,5};
printf("%d %d\n",a[0][0],a[1][0]);
定义二维数组时,可以省略行数,不能省略列数
int a[2][ ]={2,3,4,5,6,7}; //错误 无法确定具体两行几列
int a[ ][3]={2,3,4,5,6,7};
数组名
是第一行的首地址,是个行地址
a: 第一行首地址
a+1:第二行首地址
int a[2][3]={2,3,4,5,6,7};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
数组元素个数:行数*列数
数组大小:
行数*列数*数据类型大小
sizeof(数组名)
printf("%d\n",sizeof(a));
初始化
- 完全初始化
int a[2][3]={2,3,4,5,6,7};
int arr[2][3]={{2,3,4},{5,6,7}}; //按行赋值
- 部分初始化
未初始化部分,值为0
int a[2][3]={2,3}; // 2 3 0 0 0 0
int arr[2][3]={{2},{5,6,7}}; // 2 0 0 5 6 7
- 未初始化 值为随机值 需要单独赋值
int a[2][3];
内存分配
int a[2][3]={2,3,4,5,6,7};
a[0]:第一行第一列的地址
a[0]+1:第一行第二列的地址
地址 | 元素 | |||
a[0] | &a[0][0] | a | 2 | a[0][0] |
a[0]+1 | &a[0][1] | 3 | a[0][1] | |
a[0]+2 | &a[0][2] | 4 | a[0][2] | |
a[1] | &a[1][0] | a+1 | 5 | a[1][0] |
a[1]+1 | &a[1][1] | 6 | a[1][1] | |
a[1]+2 | &a[1][2] | 7 | a[1][2] |
int a[2][3]={2,3,4,5,6,7};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
printf("%d\n",sizeof(a));
printf("%p\n",a[0]);
printf("%p\n",a[0]+1);
遍历数组
int a[2][3]={};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
scanf("%d",&a[i][j]);
}
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
printf("%d\n",a[i][j]);
}
求这个数组中的最大值,及位置坐标