来自菜鸟的日程-------c语言基础篇5

1、指针:任何指针都是4个字节
p[i]=[p+i]
int
p p+1==>p向后挪4个字节
*:解引用 []:自带解引用
2、&arr+1;//代表加了整个数组
3、数组名有两种情况代表的是整个数组:
sizeof(arr)//整个数组的字节大小
&arr+1;//表示数组最后一个元素的后面
4、访问数组当中元素的方法:
(1) 可以通过下标去访问
(2)通过指针的形式访问:
int arr[5]={1,2,3,4,5};
arr[0];
int p=arr;//首元素的首地址(1)
int a=
(p+3);//代表第4个元素(4)
printf("%d\n",&arr[0]);//arr[0]的地址
printf("%d\n",arr);//首地址
(3)/sizeof(arr[5]);
int a = 10;
sizeof(a++);
int b[10] = {};
/
//相同数据类型的集合
5、字符数组:
(1)
char crr[5]={‘a’,‘b’,‘c’,‘d’};//字符数组,用单引号
//5个元素,差一个,就默认以\0结尾,不差则没有
(2)
char ch1 = 0x00;//0
char ch3 = 0;//0
char ch4 = ‘\0’;//0
char ch2 = ‘0’;//48,代表字符0
6、字符串和字符数组:
(1)
char crr[5] = {‘a’,‘b’,‘c’,‘d’,‘e’};//字符数组 5
char crr2[5] = “abcd”;//字符数组 默认会加\0 5
//注意:char crr2[5]=“abcde”;//错误,字符串末位必须是\0(默认会加)

char crr3[] = "abcdef";// 长度为7
char crr4[10] = "abcdef";//10
 
//crr4[0] = 'g';
//char crr5[10] = crr4;//error错误,数组的整体赋值只有一次机会,在初始化时

//char *const  str = "tulun";//默认会有一个\0
//printf("%s\n",str);

//*(str+1) = ‘g’;//错误,"tulun"存储在readonly段,不能修改
//字符串不能被修改
7、%s----->遇到\0才会停止
Strlen------>字符串的长度,但不包括\0,遇到\0才会停止

 char str[100] = "abcdef";
	char *str2 = "abcdef";
	char str3[] = "abcdef";
	char str4[100] = "abcdef\0xyz";
	char *str5 = "abcdef\0xyz";
	char str6[] = "abcdef\0xyz";
	char str7[] = "abcdef\n\0";
	char *str8 = "abcdef\n\0";
	printf("%d,%d\n",sizeof(str),strlen(str));// 100,6
	printf("%d,%d\n",sizeof(str2),strlen(str2));//4,6 
	printf("%d,%d\n",sizeof(str3),strlen(str3));//7,6
	printf("%d,%d\n",sizeof(str4),strlen(str4));//100,6 
	printf("%d,%d\n",sizeof(str5),strlen(str5));//4,6 
	printf("%d,%d\n",sizeof(str6),strlen(str6));//11,6 
	printf("%d,%d\n",sizeof(str7),strlen(str7));//9,7
	printf("%d,%d\n",sizeof(str8),strlen(str8));//4,7

//注意:char crr[5]={'a','b','c','d','e'};
printf("%d,%d\n",sizeof(crr),strlen(crr));//5,不打印(没有\0,停不了)

经典例题:连续子数组的最大和:
法一:

int MaxNum(int *arr,int len)
{
	assert(arr != NULL && len > 0);
	int max = 0x80000000;
	int sum = 0;
	for(int i = 0; i < len;i++)
	{
		sum = 0;//第二趟的时候
		for(int j = i;j < len;j++)//O(n^2)
		{
			sum += arr[j];//10    9  18   -82 
			if(sum > max)
			{
				max = sum;//10  18
			}
		}
	}
	return max;
}

法二(经典解法):

int MaxNum2(int *arr,int len)
{
	assert(arr != NULL && len > 0);
	int max = 0x80000000;//先定义成最小的一个数
	int sum = 0;
	for(int i = 0; i < len;i++)
	{
		if(sum <= 0)
		{
			sum = arr[i]; 
		}
		else 
		{
			sum += arr[i]; 
		}

		if(sum > max)
		{
			max = sum; 
		}
	}
	return max;
}

Ok,今天就分享到这里啦,晚安~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值