一道Realtek的C笔试题

上周五参加Realtek的笔试题,有一道选择题,大概是这样的:

const char a1[] = "abc";
const char a2[] = "abc";
const char *p1 = "abc";
const char *p2 = "abc";

A、a1和a2一样,p1和p2不一样;

B、a1和a2不一样,p1和p2一样;

C、a1和a2不一样,p1和p2也不一样;

D、a1和a2一样,p1和p2一样;

我在VS2005的环境下,将代码敲进然后仿真,发现:

a1=0x004156b0;

a2=0x004156b4;

p1=0x0041563c;

p2=0x0041563c;

由此可见,正确答案应该是B。

那么这题为什么要选B呢?后来问了一下,得到的结论是这样的:

例如:const char a1[] = "abc";是这样的一个步骤:

//当然实际代码中这样拆分开来写,应该是不对的,这里只是为了说明这个过程而已

1、const char a1[];//这个时候系统分配了一个空间,该空间的首地址即数组名a1

2、a[1] = "abc";//将字符串装进分配的内存单元之中

由此看来前两种都是先分配空间,至于空间里面装什么跟分配空间的首地址无关,也就是说编译器会分配两个首地址不同的空间给两个数组,这样两个数组的首地址当然就不同了,所以a1和a2是不同的。

而后两种,例如:const char *p1 = "abc";却是这样的一个过程:

//当然实际代码中这样拆分开来写,应该是不对的,这里只是为了说明这个过程而已

1、const char *p1;

2、p1 = “abc”;

也就是说,我们先定义一个char*的指针,然后将“abc”赋给该指针。那么这里“abc”到底是什么呢?很显然是一个常量字符串,而该常量字符串的值实际上是一个地址,指向该字符串。也就是说“abc”实际上是一个地址,而且由于该字符串是一个常量字符串,所以该指针是个常量。

那么无论p1= “abc”,p2 = “abc” 还是p3 = “abc”,都是将这个指针常量赋给了p1,p2和p3,所以p1=p2;

今天在网上搜索相关问题时,看到有人提问如下:

int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1
getchar();
return 0;
}

提问的同学想问为什么两个printf输出的不一样,在他看来应该是一样的。根据我在上面的解释,这题输出很明显是不一样的。

最后还在网上看到了一个小的知识点,是一个关于字符串常量指针的问题,原文如下:

采用指针存储字符串,其实质就是把字符串的首地值附给基类型为char的指针变量,从而可以从字符串首元素开始对字符串进行操作,这里面也存在一点问题.

用这个类子给大家解释解释.

int main()

{

char *p="hello world";

p[0]=‘H‘;

printf("%s\n",p);

return 0;

}

运行结果会出现断错误,原因在于,*p="hello world" 这句仅仅声明了一个指针变量,指向字符串"hello world",而"hello world"这个字符串程序没有给它分配空间,编译器把它分配到常量区.而常量字符串的值是不允许被修改的 ,所以会出现断错误.

程序改为如下就正确了

int main()

{

char p[12]="hello world";

char *p1=p;

p1[0]=‘H‘;

printf("%s\n",p1);

return 0;

}

原因在于,p[12]="hello world"是你自己定义的一个长度为12 的字符数组,所以字符串"hello world"编译器会给它分配空间(在栈中),所以你能修改它的值.

最后我在《C和指针》p153页末看到这样的内容:

char message1[] =  "Hello";

char *message2 = "Hello";

这两个初始化看上去很像,但他们具有不同的含义。前者是初始化一个字符数组的元素,而后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。

时间: 2024-08-01 18:29:05

一道Realtek的C笔试题的相关文章

一道简单的 Java 笔试题,但值得很多人反思

面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了.至于其它能力.综合水平,由别人把关.为此,在挑选唯一的一道笔试题时,我特别地上心. 首先,我不敢用网上那些广为流传的,比如Leetcode.<程序员面试宝典>里的题——这些都太难了!正儿八经做,其实很少有人能在1小时内完美做出来,除非之前遇

一道阿里的在线笔试题

如需转载请留言. 题目如下: 有一个消息队列集群,集群里每台Broker的响应时间RT都不一样,但是每台Broker的极限服务QPS都是一样的,超过这个QPS会出现过载雪崩.而消息的生产者客户端,每次发送都会选择其中的一台broker来发送,一般来说发送逻辑是运行在一个线程池里面.假设cpu资源充足,通过实现一个负载均衡算法,使得生产者能够达到最大吞吐量,最优的平均响应时间,但是又不能把任何一台服务器压垮.已知每个broker的rt.极限qps,消息生产者的线程数量,请求总数,如果采用吞吐量最优

分享一道弹性盒模型笔试题

请用弹性盒模型原理写出类名为divA divB divC三个元素横排三列(出divA宽度为50px,以外,其他平分剩余空间)的HTML与CSS. <style> body{ margin:0; padding:0; } .box{ width:100%; height:50px; display:flex; flex-direction:row; } .divA{ width:50px; background:blue; } .divB,.divC{ flex:1; } .divB{ back

一道有趣的微软笔试题

老师d 的物理测验答案在教室里丢失了,今天那个教室上了5 堂课,老师d 上了3 堂,有可能是a.b.c 三个同学盗窃已知:1.a 上了两堂课2.b 上了三堂课3.c 上了四堂课4.a.b.c 每个人都上了老师d 的两堂课5.五堂课中,三个人到堂的组合各不相同6.老师d 的课中有一堂,三个人中到了两个,事后证明不是那两个人偷得问?是谁偷得

一道有关数据类型的笔试题

题目 There are 4 variables: short v1 = 18; Long v2 = new Long("18"); Long v3 = new Long(18); Short v4 = new Short(v1); Which of the following statements are true: A) v1 == v2 B) v2 == v3 C) v3.equals(v1) D) v3.equals(v4) 解答 v1 == v2 的结果true,因为基本数据

一道 Python 类的笔试题详解

r = {} class C(object): def __init__(self, a, b): self.a = a self.b = b if b == 'a': orig = super(C, cls) r[cls.instance] = 1 a = C(1, 'a') b = C(1, 'a') c = C(1, 'b') l = [a, b, c] for i in l: if i not in r: r[i] = 1 else: r[i] += 1 assert r[a] == 2

一道简单易错笔试题

#include<stdio.h> int main(int argc, char* argv[]) { char c=128; printf("十进制c=%d\n",c); printf("十六进制c=0X%0X\n",c); return 0; } 结果为 十进制c= -128: 十六进制c=0XFFFFFF80: 解析: 128的十六进制是0x80, 也就是2^7, 二进制看起来像这样:1000 0000 ,赋值给有符号数char c,其二进制不变

序列和-------一道大厂秋招笔试题

题目: 给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N.答案可能有多个,我我们需要找出长度最小的那个. 例如 N = 18 L = 2: 5 + 6 + 7 = 18 3 + 4 + 5 + 6 = 18 都是满足要求的,但是我们输出更短的 5 6 7 综合网上给出的参考答案,有两种相对简单,用python语言重写一下. 方法一:从数列的角度出发 解题思路:等差数列求和. 该题可理解为“一段长度大于等于L的等差数列之和等于N”的过程. S =L(a1+an) /

[360笔试题]赛马

这是一道360的在线笔试题: 赛马,有25匹马,每次只能5匹马进行比赛,比赛只能得到5匹马之间的快慢程度,而不是速度,请问,最少要比多少次,才能获得最快的前3匹马? 解答:这道题乍一看,第一感觉就是肯定要分组,5个一组分成5组,然后比赛,得到每组的组冠军.然后让5个组冠军比赛得到前三名,似乎这样就可以了,这也是我的第一反应. 但是这是一套错误的方案,有可能有这样的分组,那就是第一组的5匹马是实力最强的,这种情况就得到不前三名.于是还要加赛一场,注意只取前三名. 最终答案要经过三步: 1.把25匹