应聘C语言类工作职位面试题大汇总5

思科

  1. 用宏定义写出swap(x,y)

  #define swap(x, y)/

  x = x + y;/

  y = x - y;/

  x = x - y;

  2.数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:

  int do_dup(int a[],int N)

  3 一语句实现x是否为2的若干次幂的判断

  int i = 512;

  cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;

  4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001

  unsigned int intvert(unsigned int x,int p,int n){

  unsigned int _t = 0;

  unsigned int _a = 1;

  for(int i = 0; i < n; ++i){

  _t |= _a;

  _a = _a << 1;

  }

  _t = _t << p;

  x ^= _t;

  return x;

  }

  慧通:

  什么是预编译

  何时需要预编译:

  1、总是使用不经常改动的大型代码体。

  2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

  char * const p;

  char const * p

  const char *p

  上述三个有什么区别?

  char * const p; //常量指针,p的值不可以修改

  char const * p;//指向常量的指针,指向的常量值不可以改

  const char *p; //和char const *p

  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

  解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;

  而str5,str6,str7,str8是指针,它们指向相同的常量区域。

  12. 以下代码中的两个sizeof用法有问题吗?[C易]

  void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母

  {

  for( size_t i=0; i< p>

  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;

  答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

  一个32位的机器,该机器的指针是多少位

  指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

  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].

  1.请问以下代码有什么问题:

  int main()

  {

  char a;

  char *str=&a;

  strcpy(str,"hello");

  printf(str);

  return 0;

  }

  没有为str分配内存空间,将会发生异常

  问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

  char* s="AAA";

  printf("%s",s);

  s[0]='B';

  printf("%s",s);

  有什么错?

  "AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

  cosnt char* s="AAA";

  然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值