C语言面试题常见问题
最近开始面试,但是面试笔试总是喜欢问奇怪的问题,下面我总结一下常见面试题。
1.下述三个有什么区别?
int ab = 12;
int ee = 0;
int *const p = &ab;
p = ⅇ
*p = ee;
const int *pp = &ab;
pp = ⅇ
*pp = ee;
printf("*p=%d,*pp =%d\r\n",*p,*pp);
test.c:31:7: error: assignment of read-only variable ‘p’
31 | p = ⅇ
| ^
test.c:35:9: error: assignment of read-only location ‘*pp’
35 | *pp = ee;
2.解释下列输出结果
char str1[] = "abc"; char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;
答案
结果是:0 0 1 1
解释:
3.以下代码中的两个 sizeof 用法有问题吗?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str 字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答案:
5.指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答案:
输出:2,5
解释:
*(a+1 )就是 a[1] , *(ptr-1) 就是 a[4], 执行结果是 2 , 5&a+1 不是首地址 +1 ,系统会认为加一个 a 数组的偏移,是偏移了一个数组的大小(本例是 5 个 int )int *ptr=(int *)(&a+1);则 ptr 实际是 &(a[5]), 也就是 a+5原因如下:&a 是数组指针,其类型为 int (*)[5];而指针加 1 要根据指针类型加上一定的值,不同类型的指针 +1 之后增加的大小不同a 是长度为 5 的 int 数组指针,所以要加 5*sizeof(int)所以 ptr 实际是 a[5]但是 prt 与 (&a+1) 类型是不一样的 ( 这点很重要 )所以 prt-1 只会减去 sizeof(int*)a,&a 的地址是一样的,但意思不一样, a 是数组首地址,也就是 a[0] 的地址, &a 是对象(数组)首地址, a+1是数组下一元素的地址,即 a[1],&a+1 是下一个对象的地址,即 a[5].
写一个“标准”宏,这个宏输入两个参数并返回较小的一个
#define Min(x,y) ((x)>(y)?(y):(x))
关键字static作用是什么
1.定义静态局部变量,作用域从函数开始到结束
2.在模块内的static函数只可以被这一模块内其他函数调用,这个函数的适用范围被限制在他的模块内
3.在类中,static成员变量属于整个类拥有,对类的的所有对象只有一份拷贝
关键字const有什么含义
1.表示常亮不可以修改的变量
2.可以修饰参数,作为输入参数
3.修饰函数,以防以外的改动
4.修饰类的成员函数,不改变类中的数据成员.
关键字 volatile 有什么含意?并举出三个不同的例子?
答 : 提示编译器对象的值可能在编译器未监测到的情况下改变。例子 : 硬件时钟 ; 多线程中被多个任务共享的变量等
从前往后看:
第一个 int :表示返回值;
*s[10] :是一个指针数组,s是一个含有10个指针的数组;
第二个int:表示形参列表
把 ( * s[10])看成一个指针*p,*p(int)就表示一个函数指针;
则 int (*p)(int) 表示:函数指针,指向一个 int func(int param) 的函数;
故 int (*s[10])(int) :解读为:函数指针数组,每个指针指向一个 int func(int param)的函数。
原文地址:https://blog.csdn.net/u010386121/article/details/138824497
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!