首页 > 编程语言 >C C++指针面试题零碎整理

C C++指针面试题零碎整理

时间:2022-09-24 13:34:44浏览次数:55  
标签:面试题 数组 int 零碎 char 地址 C++ str 指针

  1. 最基础的指针如下:
int a;
int* p = &a;

答:p指向a的地址,&是取a的地址。*指的是指针中取内容的符号。

2.str[]和str*的区别:

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都是新数组,分配新空间。所以它们的地址不同。后面四行是浅拷贝。就是把新指针指过去。

答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域

3.str[]用sizeof会出错吗?

int MyStylen(char str[])
{
    return (int)(sizeof(str)-1);//无论何时都是返回3
}

函数传递的是数组指针的时候就自动退化为指针了, 而指针的长度为4,减去1就是3。

但是按照下面的代码就会得到正常的值:

char str[] = "hello world";
int len = sizeof(str)-1;
cout<<len;//输出 11

4.注意数组指针和指针

int a[5] ={1,2,3,4,5};
int *ptr = (int *)(&a+1);
cout<<*(a+1)<<" "<<*(ptr-1);//输出2 5

&a代表的不是取a这个变量的地址,而是取数组元素的地址a指向数组的头部,就是第一个元素的地址。数组名a和&a的内存地址相同。

因此,&a+1,表示跨过了整个数组。指向的是第六位。

所以ptr-1就是a[5]的第五位。

sizeof(a) = 20 //54,长度类型字节数。

sizeof(&a) = 20 //54,长度类型字节数。

int main()
{
    int a[5];
    printf("%d\n", a);// 1245036, 指向第一个元素的首地址
    printf("%d\n", &a);//1245036, 指向整个数组的地址
    printf("%d\n",a+1);//1245040, a[1]元素的地址
    printf("%d\n",&a+1);//1245056, 整个数组的字节长度
    printf("%d\n",&a[0]+1);//1245040, 下一个元素的地址
    printf("%d\n",sizeof(a));//数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数
    printf("%d\n",sizeof(&a));//同上
    printf("%d\n",(int)a+1);//1245037 (1245036+1)
    return 0;
}

5.注意指针要分配给足够的空间

char a;
char *str = &a;
strcpy(str, "hello");
cout<<str;

请问上面的程序是否可以正常运行?

答: 不能。因为 char类型的a变量只拥有了一字节的空间,但是"hello"拥有6字节的空间(包含最后的'\0'),所以程序崩溃。

6.小心编译器的指针字符串初始化

char *s="AAA";
cout<<s<<endl;
s[0]='B';
cout<<s<<endl;

这段程序能否正常运行?

答: 不能。因为char *s默认为只读值,将char *a改为char a[]即可。如果定义const char *a也是没有必要的,因为本身已经是只读了,不需要加const设为常数值。

7.函数指针

int(*s[10])(int);

不懂。

8.函数传递指针的时候是副本

void GetMemory(char *p)
{
    p=new char[100];
    strcpy(p,"hello world");
}
void main(void)
{
    char *str=NULL;
    GetMemory(str);
    cout<<str;
    delete []str;
    str=NULL;
}

上述代码能运行吗?

解答: 不能。因为函数参数不能传递分配空间的,不能返回的。可以这样修改:

void GetMemory(char **p)   // 改成晦涩难懂的指针的指针
{
    *p=new char[100];     //给*p的分配地址
    strcpy(*p,"hello world");   // 拷贝内容到*p
}

void main(void)
{
    char *str=NULL;
    GetMemory(&str);    //这地方取地址
    cout<<str;
    delete []str;
    str=NULL;
}

9.要时刻记住初始化字符串:

char a[10];
cout<<strlen(a)<<endl;

sizeof()和初不初始化没有关系,但是库函数strlen()和初始化有关。所以strlen(a)不会返回10。

标签:面试题,数组,int,零碎,char,地址,C++,str,指针
From: https://www.cnblogs.com/mysweetAngleBaby/p/16725482.html

相关文章

  • 面试题:int[] arr 和 int... arr在参数列表中是一回事儿吗?
    publicclassExer{publicstaticvoidmain(String[]args){Base1b1=newSub1();b1.add(1,2,3);}}classBase1{publicvoidadd(inta,int...arr){System.......
  • 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++52——计算数列和2/1,3/2,5/3,8/
    本题是浙江理工大学ACM入队200题第五套中的L题我们先来看一下这题的题面.题面题目描述有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,……计算这个数列的前n项和。注意:C语言中......
  • Java面试题汇总
    1、Java基础1.1、ConcurrentHashMap的底层实现,jdk1.7和jdk1.8的区别;1.2、GC的原理,涉及到的算法有哪些,GC调优怎么处理;1.3、ArrayList和LinkedList的区别是什么,底层实现是......
  • 19道高频vue面试题,顺便写一下自己的答案
    Vue路由hash模式和history模式1.hash模式早期的前端路由的实现就是基于location.hash来实现的。其实现原理很简单,location.hash的值就是URL中#后面的内容。比如下......
  • c++ -- 做题思想
    二分思想:比较显然的就是求某一个确定的值,那么看看他是不是单调的,连续的.        其次就是,把问题通过二分来进行转化,之前的不好做,通过二分转化一......
  • UEC++ 多线程(一) FRunnable
    虚幻官方文档:https://docs.unrealengine.com/5.0/en-US/API/Runtime/Core/HAL/FRunnable/FRunnable“runnable”对象的接口。可运行对象是在任意线程上“运行”的对象......
  • 代码随想录训练营|Day 4|202,19,面试题 02.07,142,总结
    24.SwapNodesinPairsGivena linkedlist,swapeverytwoadjacentnodesandreturnitshead.Youmustsolvetheproblemwithout modifyingthevaluesinth......
  • MQTT面试题
    服务质量QoS(QualityofService),指MQTT对消息的服务质量。共有3钟服务质量:QoS=0至多发送一次(网络差的时候消息可能丢失)QoS=1至少发送一次(发送方发送一次消息,接收......
  • C++ std : : stack
    和其他序列容器相比,stack是一类存储机制简单、所提供操作较少的容器。下面是stack容器可以提供的一套完整操作:top():返回一个栈顶元素的引用,类型为T&。如果栈为空,返回......
  • C++知识整理
    2.C++编译2.1gcc编译和gdb调试的学习C程序编译成可执行文件后,才能有运行。我常用gcc工具将c程序编译成可执行文件。GCC编译流程分为四个步骤:编译预处理、编译、汇编和......