sizeof 和 strlen 深度理解 数组名是什么 冒泡排序 数组传参 二维数组

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;
}

おすすめ

転載: blog.csdn.net/weixin_52495715/article/details/119743848