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()返回参数中字符串所包括的字符数目,而作为结束标志的空字符并未计算在内。