第三章 语义陷阱

3.1指针和数组:

1:C语言中只有一维数组,且数组大小必须在编译期确定;

2:对于数组,我们只能确定该数组的大小,以及获得指向该数组下标为0的元素的指针;

3:数组名a除了作为运算符sizeof的参数这一情形外,在其他情况下都是数组a中下标为0的元素的指针。

sizeof(a)为整个数组a的大小

4:数组中实际不存在的"溢界"元素位于数组所占内存之后,这个地址可以用于进行赋值和比较,但不是引用该元素是非法的


3.5空指针并非空字符串——0被转换成指针使用时,这个指针绝对不能被解引用。


3.6不对称边界(推荐使用)——即使用第一个入界点喝第一个出界点来表示一个数值范围


3.7求值顺序:只有&&、||、?!、,这四个运算符存在规定的求值顺序

1:&&、||首先对左侧求值,只有在需要的时候才对右侧求值

譬如 :if(y!=0 && x/y >c)保证了当y为非0时才对x/y求值


两段代码:

1:编写一个函数,对一个已排序好的整数表执行二分查找。函数输入包括一个指向表头的指正,表中元素个数,以及待查找的数值。函数输出是一个指向满足查找要求的元素的指针,当未查到满足要求的数值时,输出NULL



int *bsearch1(int *t,int n,int x)
{
	int lo=0,hi=n;
	while (lo<hi)
	{	
		int mid=(lo+hi)/2;
	//  int mid=(lo+hi)>>1;
		if (t[mid]==x) return t+mid;
		else if(t[mid]>x) hi=mid;
		else lo=mid+1;
	}
	return NULL;
}

int *bsearch2(int *t,int n,int x)
{
	int lo=0,hi=n;
	while (lo<hi)
	{	
		int mid=(lo+hi)/2;
		int *p=t+mid;
		if (*p==x) return p;
		else if(*p>x) hi=mid;
		else lo=mid+1;
	}
	return NULL;
}


2:将字符串s,t合并成r

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int _tmain(int argc, _TCHAR* argv[])
{
	char *s="cheng",*t="lehong";
	char *r=(char*)malloc(strlen(s)+strlen(t)+1);
	if (!r)
	{
		printf("Allocate memory failure");
		exit(1);
	}
	strcpy(r,s);
	strcat(r,t);
	printf("%s",r);
	free(r);//注意释放内存
	return 0;
}

注 1:动态分配内存时要检查是否分配成功,其次要显式释放内存。

     2:strlen()返回参数中字符串所包括的字符数目,而作为结束标志的空字符并未计算在内。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值