解答:第一题:是对二维数组初始化问题的考察,初始化结果只是给a[1][0]=2;a[1][1]=3进行了赋值,其他值全都为0;可见二维或多维数组一直都是各公司的考察重点。
第二题: 后面是括号,那么前面应该就是函数的返回类型了,虽然我对这种形式不熟悉,但这应该是在声明,指针函数。
第三题:指针式地址就和一般数据一样,但是地址不可以进行比较运算,应该是指针变量吧,而且在任何情况下也是不正确的,如果不是同类型的,比较就没有意义。
答案:6,4,4
解答:首先数组中存放的字符串应该考虑到最后的结束字符‘\o',这样计算sizeof()以字节为单位的时候,就会使(字符数+1)这个结果。
而这里是一个字符指针,所占4个字节。
注意:sizeof()最大的相关性是编译器,32位的只能占4位,不同的编译器所得到的int 等数据类型的结构是不同的。
而这个结果也是 4,在这里的str并不是一个数组名,而是形参指向实参的一个指针。所以sizeof()值为 4.
解答:这个题我也挺模糊的,我不明白它在test函数中调用的函数 getmemory()是什么,难道是和上面的setmemory()对应自己来理解,不明白,但是我知道的是strcpy 这个函数将,后一个字符串,赋值给前一个,所有打印str 就应该是 “hello”。
注意:我在做题的过程中,将这个练习和其他的混在一起了,导致想贴个代码都不方便,下次练习实现时,记得要分开。 习惯从现在养成。
int arr[]={6,7,8,9,10};
int *you=arr;
*(you++)+=123;
printf("%d,%d\n",*you,*(++you));
//纳尼,这他妈的也可以啊、等会输出是?从右往左的吗???
输出结果 :8,8
//证明一下
int guagua=10;
printf("%d,%d \n",++guagua,++guagua);
//通过上面这个输出,就证明了输出是从右往左的,但是又出现的那个问题
printf("%d,%d \n",(guagua++),(guagua++));
//不加括号时,结果是10,10 加上后是12,12
printf("%d \n",guagua);
输出结果:12,11 和 12,12 ,14 如果在第二个输出时不加括号,结果是10,10
int xixi=10;
xixi++;
xixi++;
printf("%d,%d \n",xixi,(++xixi));//好吧,我基本晕了
//不知道可不可以这样理解,++x是输出值,而x++中,x才是输出值,
输出结果:13,13
综上所述:这在里主要牵扯的是,运算的优先级问题:++x > printf > x++,并且输出是,运算的顺序是从右往左的。
答案:
int strcmp(char *source,char *dest)
{
while((*source!='/0')&&(*source==*dest))
{
source++;
dest++;
}
return ((*source)-(*dest))?-1:0;
//注意: 这是一个三目运算 if(表达式==ture) return -1; else return 0;(而对于这个表达式来说,两个字符相等为0,不等相减结果不为0, 就是ture了。
}
为什么我写的看起来就这么麻烦呢??
int strcmp(char *One,char *Two)
{
int lenth1,lenth2;
lenth1=strlen(One);
lenth2=strlen(Two);
if(lenth1!=lenth2)
{
printf("%d,%d,thay are not same lenth!\n",lenth1,lenth2);
return -1;
}
while(lenth1>0)
{
if(*(One)!=*(Two))
{
printf("%d,%d,thay are not same lenth!\n",lenth1,lenth2);
return -1;
}
else
{
lenth1--;
One++;
Two++;
}
}
if(lenth1=1) return 0;
}
回文: 字符串的对称 比如:level
答案:
int fun(char *p)
{
int len=strlen(p)-1;
char *q=p+len; //直接可以将另一个指针指向字符串的末尾
if(!p) return -1; //这就是错误? 我去
while(p {
if((*p++)!=(*q--)) return 0;
}
return 1;
}
用两个指针分别指向字符串的首尾就可以了,我写的就有点麻烦了:
#include
#include
int fun(char *p)
{
int lenth;
lenth=strlen(p);
if(lenth%2==0)
{
while(lenth/2>0)
{
if(*p!=*(p+lenth-1)) return 0;
else {
lenth-=2;
p++;
}
}
return 1;
}
else
{
while(lenth/2>1)
{
if(*p!=*(p+lenth-1)) return 0;
else {
lenth-=2;
p++;
}
}
return 1;
}
}
void main(){
char *q="abba";
// printf("please input your char* \n");
// scanf("%s",q);
// printf("%s",q);
int x;
x=fun(q);
switch(x)
{
case 1:
printf("yes\n");break;
case -1:
printf("wrong\n");break;
case 0:
printf("no\n");break;
}
}
总结一下吧,从华为整个题目的组成来讲,考察的都是C语言的基础知识,和对字符串的处理。不过到底是笔试题,考察的都很基础,而且这好像还是2005年的,算啦,就当是对基础知识的复习吧。