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

  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。

原文链接:https://www.cnblogs.com/mysweetAngleBaby/p/16725482.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C C++指针面试题零碎整理 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 苹果的app上架被黑了怎么办?

      1、您的应用程序必须使用正式的图像。正式的文字,在上板时不要出现测试类图像,例如一个母亲婴儿商店,你上传了一个不相关的图片。或者用测试字眼写的图像,都不能。文本中也不能出现测试类的单词,如测试等。如果您以前在后台上传过测试字眼的产品,请先删除它并重新登录。 2、你的APP还没有完成,如果模块还没有完成,请隐藏这个模块,但不能出现“该模块正在开发”等词语。…

    IOS 2023年4月18日
    00
  • iOS从UI内存地址到读取成员变量(oc/swift)

    开发调试时,我们发现bug时常首先是从UI显示发现异常,下一步才会去定位UI相关连的数据的。XCode有给我们提供一系列debug工具,但是很多人可能还没有形成一套稳定的调试流程,因此本文尝试解决这个问题,顺便提出一个暴论:UI显示异常问题只需要两个步骤就能完成定位工作的80%: 定位异常 UI 组件的内存地址。 利用内存地址读取其成员变量。 定位异常UI组…

    IOS 2023年4月19日
    00
  • 2022超详细流程ios APP最新打包上线教程,保证一看就会!

    这篇文章主要是想要给大家讲述一下APP打包上线到APP Store的详细流程。作为一名开发人员,上架APP是必须要会的,否则出去都不好意思说自己是iOS程序员。而且上线过APP的小伙伴肯定都知道,iOSAPP上线相比安卓的APP上线要复杂麻烦很多,一不小心就会掉进坑里。所以下面我将会带着大家一步一步的学习如何打包上线一个APP和那些年我们遇到的坑。 好了,下…

    IOS 2023年4月18日
    00
  • 京喜APP – 图片库优化

    作者:京东零售 何骁 介绍 京喜APP早期开发主要是快速原生化迭代替代原有H5,提高用户体验,在这期间也积累了不少性能问题。之后我们开始进行一些性能优化相关的工作,本文主要是介绍京喜图片库相关优化策略以及关于图片相关的一些关联知识。 图片性能问题 作为电商APP,图片在各个业务场景被大量使用。我们需要做到尽可能降低网络消耗/内存消耗/硬盘消耗,同时不降低图片…

    IOS 2023年5月11日
    00
  • AppStore审核被拒:other-other,过审核、不过审的经历

      最新版Other问题,请查看我最近的一片文章 我主要开发小型应用,周期较短,提审较频,使用帐号也多,正常申请的三方购买的都有使用。提审时经常会遇到这样那样的问题,单独说other-other,也曾遇到过不下10次,我将会导致出现这个问题的原因分为几类: 1、帐号问题: 大概半年前的那段时间苹果对帐号注册进行调整,目前已经较为稳定。但是调整的这段时间经常会…

    IOS 2023年4月18日
    00
  • iOS 悬浮球效果实现,悬浮按钮,拖拽,贴边,隐藏,显示,旋转屏幕适配

    1.悬浮球与设备刘海的安全距离无论是横屏还是竖屏,悬浮球距离有刘海的一边会留出安全距离设备方向的上下两边,也有安全距离 2.贴边吸附方向和距离悬浮球只能贴设备方向的左右两边,需要贴上下两边自行调整距离边缘的数值自行调整 3.切换横竖屏,悬浮球自适应悬浮球位置切换横竖屏后,等比例转换的。 4.隐藏和显示拖到屏幕中间ImageView范围内可以隐藏悬浮窗,在范围…

    IOS 2023年4月18日
    00
  • iOS上架流程

    1 准备 2 申请App ID 2.1 打开[苹果开发者官网](https://developer.apple.com),点击Account登陆账号。 2.2 进入ID申请 3 创建证书请求文件(*.cerSigningRequest文件) 4 添加软件开发证书和分发证书 并下载(*.CER文件) 5 创建Profile配置文件 6 新建开发者应用 7 打包…

    IOS 2023年4月17日
    00
  • xcode历史版本下载

    一、背景 较早之前做过一个项目,当时使用swift 3.x开发。 项目结束后就没再有新需求与更新。 但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来。 我们知道现在的swift 版本已经到了 5.x, 相应的语法上较 3.x版本也有了不小的变化。使用最新版本的xcode都已经不支持swift 3.x的 swift version. 所以目前面临两种…

    IOS 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部