2019年9月28日星期六

C语言-----指针篇

C语言---指针经典面试题总结与解析



1. char * const p;
  char const * p
  const char *p

  上述三个有什么区别?

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

解析:指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。

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
str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域,编译时会被替换成相应的地址

3.
int 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)
       作为对比a+1代表第二个元素,a是一个int型指针,而&a是一个int[5]型的指针
  int *ptr=(int *)(&a+1);
  则ptr实际是&(a[5]),也就是a+5

4.  int main()
 {
     int a[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     int *ptr1 = (int *)(&a + 1);
     int *ptr2 = (int *)(*(a + 1));
     printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));


     system("pause");
     return 0;
}
这道题考察了对二维数组的理解,我们知道数组在内存中是线性连续存放的,所以二维数组也是如此。
&a+1:与一维数组同理,所以此时+1指向了下一个数组的起始位置,*(ptr1-1)即就是该数组的最后一个元素10。
(a+1):指向下一个元素,这里需要我们将二维数组看作一维数组(该数组有两个元素,每个元素是一个一维数组),所以a此时表示第一个元素,+1指向下一个元素即就是第二个一维数组的起始,*(ptr2-1)即就是上一个一维数组的最后一个元素5;

5.    char* s="AAA";
  printf("%s",s);
  s[0]='B';
  printf("%s",s);

  有什么错?

  答案:
"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。


6.    有以下表达式:

  int a=248; b=4;
  int const c=21;
  const int *d=&a;
  int *const e=&b;
  int const *f const =&a;

  请问下列表达式哪些会被编译器禁止?为什么?
  *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;


  答案:
       *c 这是个什么东东,禁止
  *d 说了是const, 禁止
  e = &a 说了是const 禁止
  const *f const =&a; 禁止

7. int MyStrlen(char str[])

{

    return (int)(sizeof(str)-1);

}

呵呵...咱们上当过一次..这个当然也是不对的...不错...这个函数是错的...为什么呢?

首先,可以告诉你,无论何时,返回的总是3...额...是不是很奇怪,为什么不是数组长度呢?str不是char数组指针么?不错...确实是数组的指针,但是,当用函数传递的是数组指针且接收的也是数组的时候就自动退化为指针了(可以用引用的方法来避免指针的退化),而指针的长度是4,你减去1了自然就是3了(32位系统).但是如果按照下面代码就可以得到正常的值.

char str[]="hello world";

int len=sizeof(str)-1;   //记得减1哦,最后有'\0'结尾

cout<<len;

这样输出的是正常值,也就是你所希望的11;


OK,今天就这样了,这是我搜集到的一些关于C语言指针部分的面试题,还有答案,如果有哪里理解的不对敬请指出~

今日分享:
人生天地之间,若白驹过隙,忽然而已。
这是庄子的一句话,其实仔细想想,人生的前18年不受自己控制,人生的后10年自己没能力控制,在加上各种琐事,本就没有太多时间留下,如果不能很好地控制自己的时间,可能真就会混混沌沌的过完一生吧,现在已经大二了,时间其实非常的紧迫啊,到现在连个挖洞的能力都没有。。。

没有评论:

发表评论

XSS速查表

今天继续XSS的进一步学习,以下内容转载自Freebuf上的文章,原文章来自OWASP的xss备忘录 1.介绍 这篇文章的主要目的是给专业安全测试人员提供一份跨站脚本漏洞检测指南。文章的初始内容是由RSnake提供给 OWASP,内容基于他的XSS备忘录: http://...