sizeof 和 strlen 深度理解
1.strlen 和 sizeof没有什么关联
2.strlen 是求字符串长度的-只能针对字符串求长度- 库函数 --使用得引头文件
3.sizeof 计算变量,数组,类型的大小-单位是字节- 操作符
sizeof和strlen具体实例如下
#include<stdio.h>
int main()
{
int arr[10] = {
1,2,3};//不完全初始化,剩下的元素默认初始化为0
char arr1[] = "abcdef";
printf("%d\n", sizeof(arr1));//7
sizeof//是计算arr1所占空间的大小
// \0也占空间,但不算个数,里面是7个元素,
//每个元素大小是char也就是1,7*1=7
printf("%d\n", strlen(arr1));//6
//[a b c d e f \0]
//strlen 是在求字符串的长度,'\0'之前的长度
'\0'只是字符串结束的标志
return 0;
}
#include<stdio.h>
int main()
{
char arr1[] = "abc";//这个里面有\0
char arr2[] = {
'a', 'b', 'c' };//这个里面没有\0
printf("%d\n", sizeof(arr1));//4
printf("%d\n", sizeof(arr2));//3
printf("%d\n", strlen(arr1));//3
printf("%d\n", strlen(arr2));//随机值,因为没有\0字符串结束标志
return 0;
}
#include<stdio.h>
int main()
{
char arr[] = "abcdef";//[a][b][c][d][e][f][\0]
int i = 0;
int len = strlen(arr);
for (i = 0; i < len; i++)
{
printf("%c\n", arr[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
int arr[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
//整型数组,可以使用sizeof计算大小
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
//数组使用下标来访问的,下标是从0开始的
//数组的大小,可以通过计算得到
int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
数组在内存中的存放是连续的
#include<stdio.h>
int main()
{
int arr[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("arr[%d] = %p\n",i,&arr[i]);
}
return 0;
}
//数组在内存中是连续存放的
//10进制:0-9
//16进制:0-9 a b c d e f
// 11 12 13 14 15 16
二维数组的创建
#include<stdio.h>
int main()
{
int arr[3][4];//表示的是3行4列
char arr[5][6];//表示的是5行6列
double arr[2][4];//表示的是2行4列
return 0;
}
二维数组初始化
#include<stdio.h>
int main()
{
int arr[][4] = {
{
1, 2, 3, 4 }, {
5, 6, 7, 8 } };
二维数组初始化,行可以省略,列绝对不能省略
return 0;
}
二维数组简答应用
#include<stdio.h>
int main()
{
int arr[3][4] = {
{
1, 2 }, {
2, 2, 1 } };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
//这里的i表示行 j表示列
}
printf("\n");
}
return 0;
}
二维数组在内存中也是连续的
我们要找到一维数组中的某个元素时,必须要使用下标的
方式比如 在 arr[]={1,2,3,4,5,6,7,8,9}; 我们要找到第三个
元素就必须要使用下标的方式来 arr[2];下标永远从0开始
那么二维数组就把arr[0]来比作数组的数组名
arr[0][j]的意思就是访问第一行的第j个元素
arr[0]作为第一行访问的一维数组的数组名
arr[1][j]的意思就是访问第二行的第j个元素
arr[1]作为第二行访问的一维数组的数组名
这样就方便了查找二维数组的元素
冒泡排序 数组传参
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
//确定冒泡排序的趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设这一趟要排序的数据已经有序
//每一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j]>arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//本躺排序的数据其实不完全有序
}
}
if (flag == 1)
{
break;
/*
break语句,只用于for和switch,在if语句中不能使用
因为if语句不是循环语句,所以不能用break来结束
,但是如果if语句本身就在循环之中
就可以在if语句中使用它
*/
}
}
}
int main()
{
int arr[] = {
9, 8, 17, 6, 15, 4, 3, 2, 1, 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//对arr进行排序,排成升序
//arr是数组,我们对数组arr进行传参,实际上传递过去的
//是数组arr首元素的地址&arr[0]
bubble_sort(arr, sz);//冒泡排序函数
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
arr是数组,我们对数组arr进行传参,实际上传递过去的
是数组arr首元素的地址&arr[0]
数组名是什么 数组名是首元素的地址
有两个例外,数组名不是首元素的地址
1.sizeof(数组名)-数组名表示整个数组,sizeof(数组名)计算的是整个数组大小,单位是字节
2.&数组名 ,数组名代表的是整个数组,&数组名,取出的是整个数组的地址
//首元素的地址,可能跟数组的地址是一样的,但是意义不一样,数组的地址是开始的地址整个数组的地址。
#include<stdio.h>
int main()
{
int arr[] = {
1, 2, 3, 4, 5 };
printf("%p\n", arr);//数组名是首元素地址
printf("%p\n", &arr[0]);//真的把数组首元素地址拿出来,看看是不是和数组名一样
printf("%d\n", *arr);
return 0;
}