C语言的数组笔记

1 。sizeof()是计算元素所占的空间------------  是运算字符,后面有\0

      strlen  ( )是求字符串的长度---------------------  是 库函数,要引头文件

      打印地址用%p

数组在输入时需要一个定义,之后还需要一个for循环

int arr[100000]    for(i=0 ; i<n根据题意来确定n ; i++)   scanf("%d",&arr[ i ])

数组的初始化--------------------------------------------------------------------------------------------------------------

在创建数组的同时给数组的内容一些初始化

如int arr[10]={1,2,3}数组里面有10个整数型,其中第一个是1,第二个是2,第三个是3.

可以char arr【abc】,也可以char arr“abcdef”    sizeof(arr“abcdef”)=7,因为后面有\0;

strlen(arr"abcdef")=6,因为只是求字符串的长度

当char arr【】arr的中间没有数的时候,必须要给这个数组初始化,去定义有几个元素,如char arr【】={abcdef},这个数组是7个元素,

二维数组 arr【可省略】【不可省略】

行可以省略,但是列不可以省略。

arr 【】={1,2,3,4}

#include<stdio.h>
int main()
{
	int arr[3][4]={{1,2,3},{4,5}};
	int i;
	for(i=0;i<=3;i++)
	{
		int j;
		for(j=0;j<=4;j++)
		{
			printf("%d",arr[i][j]); //这个[i]和[j]是下标,是1,2,3,4,5对应的下标 
		}
		printf("\n");              //当j=5 的时候,对应的是0 
	}
	return 0;
}

arr[i ][j ]的[  ]里对应的是数组中的下标,当j= 5 时对应的是0;

利用数组去解决冒泡思想

//对arr进行升序排列
#include<stdio.h>
void bulbbe_sort(int arr[],int sz)
{
	//先确定冒泡的趟数,就是几个元素冒几-1次泡 
	int i;
	int j;
	for(i=0;i<=sz-1;i++)
	{
		//再去确定一次的冒泡的思路
		 for(j=0;j<=sz-1-i;j++)
		 {
		 	if(arr[j]>arr[j+1])
		 	{
		 		int tmp;          // 9 10 8 7 6 5 4 3 2 1 
		 		tmp=arr[j];       // 9 8 10 7 6 5 4 3 2 1
		 		arr[j]=arr[j+1];
		 		arr[j+1]=tmp;
			 }
		 } 
	} 
}
int main()
{
	int arr[10]={10,9,8,7,6,5,4,3,2,1};
	int sz=sizeof(arr)/sizeof(arr[0]);
	bulbbe_sort(arr,sz);
	int k;
	for(k=0;k<=sz;k++)
	{
		printf("%d ",arr[k]);
	}
	return 0;
 } 

 将 10 9 8 7 6 5 4 3 2 1这一组数排成升序

先判断一更要进行多少趟

比如 10 9 8 7 6 5 4 3 2 1

         9 10 8 7 6 5 4 3 2 1     //先两对两对的比较,10 和9,之后再10 和8,一更要进行9次比较

由此也可以看出,一更要进行9趟冒泡(先把10挪到后面,再9挪到后面......)

第一趟,需要比上9对    之后10 就到了本来该在的位置了   所以第二趟的时候要比上8对就可以了

第二趟     9 8 7 6 5 4 3 2 1 10

                8 9 7 6 5 4 3 2 1 10       所以要 j < = sz - 1 - i

//你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
//输入: [3,2,1,5,6,4], k = 2
//输出: 5
#include<stdio.h>     //返回第三个最大的值 
int main()
{
	int arr[10]={23, 99, 50, 15, 55, 38, 99, 76, 52, 8};
	int i;
	int j;
	for(i=0;i < 10;i++)
	{
		for(j=0;j < 10-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int tmp;
				tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	//	printf("%d ",arr[j]);
	}
	scanf("%d",&i);
	printf("%d ",arr[10-i]);
	
	return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

  主函数中的bulbbe_sort(arr,sz)这个实参的arr传到形参的arr中,所传的其实是arr 数组中第一个元素的地址      如第一个数  9 的地址         

sizeof(arr)  在主函数里使用时是一组数组(能计算整个数组的大小),如果传到形参里去时,传了arr的第一个元素,

当&arr 的时候,取出得是整个数组的地址

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6,7,8};
	printf("%p\n",arr);     // =地址
	printf("%p\n",&arr[0]);  //=地址
	printf("%p\n",&arr);     //=地址(所有元素的地址,但是这个只输出元素的开头地址)
    printf("%d\n",*arr);    // =1    //这个指针是arr在指针的第一个元素的内容,指针是内容。 
	return 0;
}

 &arr 是输出所有数组的的地址,但是,这个只是输出第一的元素的地址,也就是表示元素的开始的地址

//对arr进行升序排列
#include<stdio.h>
void bulbbe_sort(int arr[],int sz)
{
	//先确定冒泡的趟数,就是几个元素冒几-1次泡 
	int i;
	int j;
	int flat=1;
	for(i=0;i<=sz-1;i++)
	{
		//再去确定一次的冒泡的思路
		 for(j=0;j<=sz-1-i;j++)
		 {
		 	if(arr[j]>arr[j+1])
		 	{
		 		int tmp;          // 9 10 8 7 6 5 4 3 2 1 
		 		tmp=arr[j];       // 9 8 10 7 6 5 4 3 2 1
		 		arr[j]=arr[j+1];
		 		arr[j+1]=tmp;
		 		flat=0;
			 }
		 } 
		 if(flat==1)
		 {
		 	break;
		 }
	} 
}
int main()
{
	int arr[10]={9,0,1,2,3,4,5,6,7,8};
	int sz=sizeof(arr)/sizeof(arr[0]);
	bulbbe_sort(arr,sz);
	int k;
	for(k=0;k<=sz;k++)
	{
		printf("%d ",arr[k]);
	}
	return 0;
 } 

当然这个冒泡的思想最好还是加上个状态  flag  这样就不会当数组是升序的,程序还是一遍一遍的进行了。   上文中的break,是跳出的for循环,和if语句没有任何关系

首元素地址  

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6,7,8};
	printf("%p\n",arr);
	printf("%p\n",&arr[0]);
    printf("%p\n",&arr);    //表示的是取整个数组的地址,但是这个的意思是数组的开头地址
	return 0;
}

当这个结果运行出来时,我会发现,printf的输出都是一样的,但是第三个是首元素开头的地址(取出的是整个元素的地址),并不是只有一个元素的地址,而是代表数组是从这里开始的    看下面的代码,就可以看出,&arr+1  是整个数组的+1

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6,7,8};
	printf("%p\n",arr);                         //000000000062FE00
	printf("%p\n",arr+1);                       //000000000062FE04
	
	printf("%p\n",&arr[0]);                     //000000000062FE00
	printf("%p\n",&arr[0]+1);                   //000000000062FE04
	
	printf("%p\n",&arr);//表示数组从这里开始      //000000000062FE00
	printf("%p\n",&arr+1);                      //000000000062FE20
	return 0;
}

通常情况下,数组名都是首元素地址

1.但当sizeof()内部单独放一个数组名,数组名表示整个数组(为了计算的是整个数组的大小  单位是字节)

2.&arr的时候,数组名 (arr)代表整个数组(为了取整个数组的地址)                //除了sizeof(数组名),&数组名,其他遇到的数组名都是   数组首元素的地址。

#include<stdio.h>
int blubbe_sort(int arr[],int sz)
{
	int i;
	int j;
	int flat=1;
	for(i=0;i<=sz-1;i++) //因为是数组,0代表下标 
	{
		for(j=0;j<=sz-1-i;j++)
		{
	       if(arr[j]<arr[j-1])
		   {
		   	 int tmp;
		   	 tmp = arr[j];
		   	 arr[j] = arr[j-1];
		   	 arr[j-1] = tmp;
		   	 flat=0;
			} 
		}
		if(flat==1)
		{
			break;
		}
	}
	return 0;
}
int main()
{
	int arr[]={1,4,2,5,7,9,6,4};
	int sz=sizeof(arr)/sizeof(arr[0]);
	blubbe_sort(arr,sz);
	int k;
	for(k=0;k<sz;k++)
	{
		printf("%d ",arr[k]);//这个是下标代表数组 
	}
	return 0;
}

注意注意是下标代表数组啊!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值