day5笔记排序、二维数组、指针

8.1笔记
【1】计算字符串中字符个数(字符串的实际长度)
1.for循环 ,将判断条件设置为不等于\0 进行计数加1
在这里插入图片描述

2.sizeof(数组名)/sizeof(数据类型)
3.sizeof(数组名)-1
4.strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际长度
参数:s:字符串的首地址
返回值:字符串的实际长度
在这里插入图片描述

sizeof和strlen的区别?
1.sizeof是一个关键字,strlen是一个函数
2.sizeof作用用来计算数据所占空间大小,strlen就是用来计算字符串的实际长度
3.sizeof计算时包含\0但是strlen不包含,sizeof比strlen多一个(在定义字符数组忽略掉元素个数的情况下)

练习:实现字符串大小写的转换
在这里插入图片描述

【2】冒泡排序
两两进行比较,相邻的两个数进行比较,特点:第一轮比较完成之后最大值在最后面
int a[5]={5,4,3,2,1};
第一轮:i=0;----外层循环控制轮数(终止条件:元素个数-1),内层循环控制取到的元素(比较次数,终止条件:数组元素的个数-1-i)
5和4进行比较----》交换位置—》45321
5和3进行比较—》交换位置—》43521
5和2进行比较—》交换位置—》43251
5和1进行比较—》交换位置—》43215
比较了4(元素的个数-1)次,j=0-3 j<4-0,
第二轮:i=1
4和3进行比较—》交换位置----》34215
4和2进行比较—》交换位置----》32415
4和1进行比较—》交换位置----》32145
比较了三次,j=0-2,j<4-1
第三轮:i=2
3和2进行比较—》交换位置----》23145
3和1进行比较—》交换位置----》21345
比较了二次,j=0-1,j<4-2
第四轮:i=3
2和1进行比较—》交换位置----》12345
比较了一次,j=0,j<4-3
算法实现:
在这里插入图片描述

【3】选择排序
在n个数中找最小值,标记下标,特点:第一轮结束之后最小值在最前面
int a[5]={5,4,3,2,1}
k=0,i=1
a[k] >a[i]---->k=i
5和4—》k=1
a[k]>a[i]
4和3进行比较—》k=2
3和2
2和1-----》k=4
a[k] a[0]交换位置
双重循环 外层控制轮数i, 内层比较的次数j
i=0,默认标记的最小值时 a[0] k=0, j=0+1 a[j] a[k]
i=1,默认标记的最小值时 a[1] k=1,j=1+1—>j=i+1
i=2,默认标记的最小值时 a[2] k=2,j=2+1。。。。
如果数组有n个元素,轮数需要比较n-1轮,第一轮比较时循环变量j=1
在这里插入图片描述

【4】二维数组
格式:存储类型 数据类型 数组名[行数][列数]
int arr[2][3];//定义了一个两行三列的二维数组
int arr[2][3]={1,2,3,4,5,6};
访问元素:数组名[行下标][列下标]:行下标和列下标都不能超过行数和列数,注意不能数组越界
在这里插入图片描述

定义时可以省略行数但是不可以省略列数
int arr[][3]={1,2,3,4,5,6} //可以省略行数
int a[2][]={} //不可以
元素的个数:行数列数
数组的大小:行数
列数*数据类型的大小
sizeof(数组名)
二维数组的数组名:
一维数组中:int a[3]={1,2,3} ----->a就是第一个元素的地址 a+1:第二个元素的地址
二维数组中:int arr[2][3]={1,2,3,4,5,6};----->arr表示第一行的首地址, arr+1:第二行的首地址=arr[1]
arr[0]----->表示第一行第一列的地址 arr[0]+1:第一行第二列的地址
对地址进行加法操作加的是数据单位,而不是一个字节数 a+1:向后移动一个数据单位而不是一个字节,数据单位的移动大小取决于数组的数据类型,int----一个数据单位就是4个字节,char--------一个数据单位就是一个字节
初始化
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,3,4};//按照顺序赋值 1,2,3,4,0,0
int a[2][3]={{1,2},{4}};//按照行进行赋值 1,2,0, 4,0,0
3.未初始化:只能一个元素一个元素的赋值 未赋值取值是随机数
int a[2][3];
a[0][0]=1;
练习:
在这里插入图片描述

答案:A
在这里插入图片描述

答案:C
在这里插入图片描述

答案:B
内存存储
在这里插入图片描述

二维数组的遍历
for嵌套 外层循环控制行数 内层循环控制列数

int  a[m][n]={};
int i,j;
for(i=0;i<m;i++){
    for(j=0;j<n;j++){
        scanf()/printf();
    }
}

练习:有一个3x4的矩阵(元素值不相同),要求输出其中最大值以及它的行号和列号
【5】指针
地址:内存当中每个字节都是一个单元格 每个单元格都有一个编号
指针:就是地址,内存地址
指针变量:用来存储指针的变量
定义格式:存储类型 数据类型 *指针变量名
int *p;//定义了一个int类型的指针p
int a=10;int *p=&a;
在这里插入图片描述

注意:定义指针的数据类型和将要存储的数据的数据类型保持一致
char a=‘v’;
char *p=&a;
指针的操作符
&:取地址符 ,取变量的地址
*:取内容,对地址进行取内容
*&a:—》a:10
&*a:----》错误
&*p:—》可以
指针和指针所指的变量之间的关系
在这里插入图片描述

int a=20;
int *p=&a;
打印a的值:a *p
打印a的地址:&a p
初始化
1.将普通变量的地址赋值给指针
1>.int a=20;
int *p=&a;//在定义的同时进行赋值
2>.int a=20;
int *p=NULL;
p=&a;//先定义后赋值
a=30;---->*p=30
2.将数组的首地址赋值给指针
char s[10]=“hello”;
char *p=s;//存储数组中第一个元素的地址 指向h字母
3.将指针变量的内容赋值给另一个指针
float a=1.99;
float *p=&a;
float *q=p; //将指针p的内容赋值给指针q
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值