[1]计算字符串实际元素个数
int i;
for (i = 1; i < 5; i++)
{
printf("%d\n",i); //1 2 3 4
}
printf("%d\n",i); //5
———————————————————————————
char a[32]="hello";
int i;
for ( i = 0; a[i]!='\0'; i++); // ;循环结束。
printf("%d\n",i); //可计算出元素个数 5
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));
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");
[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 < 4; i++) //5个数轮四次
{
for (int j = 0; j < 4-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]);
}printf("\n"); //2 3 4 5 6
[3] 选择排序
假设第一个元素最小,再与后边的每一个元素进行比较,比较过程中若遇到了更小值,暂存其下标位置,直到一轮比较结束后,再把最小值和最左边元素位置进行交换。
int a[5]={6,5,4,3,2},m,temp;
for (int i = 0; i < 4; 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]);
}printf("\n");
return 0;
}
二维数组
格式:
数据类型 数组名[行数][列数]
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] |
定义二维数组时,可省略行数,不能省略列数。
inta[2][ ]={2,3,4,5,6,7}; //错误 无法确定具体两行几列
inta[ ][3]={2,3,4,5,6,7};
数组名
数组名:是第一行的首地址,是个行地址
a: 第一行首地址
a+1:第二行首地址
a[1]:第二行第一列
a[0]:第一行第一列的地址
a[0]+1:第一行第二列的地址
int a[2][3]={2,3,4,5,6,7};
printf("%p %p\n",a,&a[0][0]); // a 第一行首地址
printf("%p %p\n",a+1,&a[1][0]); //a+1加了行,第二行
数组元素个数:行数*列数
数组大小:
行数*列数*数据类型大小
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};//230000
int arr[2][3]={{2},{5,6,7}};//200567
● 未初始化
值为随机值需要单独赋值
内存分配
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]);
}
遍历数组(外层行,内层列)
求这个数组中的最大值及最小值
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[2][3] = {};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
}
int max = a[0][0], min = a[0][0];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
if (max < a[i][j])
max = a[i][j];
if (min > a[i][j])
min = a[i][j];
// printf("%d %d\n",max,min);
}
}
printf("最大值为:%d 最小值为:%d\n", max, min);
return 0;
}