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

yizhihongxing
  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日

相关文章

  • Apple Xcode 14 (14A309) 正式版发布 (含下载)

    Command Line Tools for Xcode 14tvOS 16 Simulator RuntimewatchOS 9 Simulator Runtime 请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org Xcode 14 包…

    IOS 2023年4月18日
    00
  • 上架app store流程详解

    本篇文章主要介绍使用Hbuildx开发的移动端项目,打包以及上传值苹果应用商店全部流程。 一、条件1.苹果App Store上传应用流程详解,在向AppStore提交应用之前,开发者首先要成为苹果iOS开发者项目的成员,每年向苹果缴纳99美元或199美元的费用(具体申请方法后期更新)。其次创建相应的证书 Development是开发环境下的证书, Produ…

    IOS 2023年4月18日
    00
  • 日本开放Wi-Fi 6E认证

    2022年9月2日,日本MIC(総務省)发布了“電波法施行規則等の一部を改正する省令(令和4年総務省令第59号)”省令,更新了Wi-Fi 6E Band 5频带5925 ~ 6425 MHz的技术要求。隔天(9月3日),日本DSP机构发布了“「6GHz帯小電力データ通信システム」の特性試験方法”,为日本Wi-Fi 6E认证提供了测试方法。   電波法施行規則…

    IOS 2023年4月18日
    00
  • iOS 深色模式适配

    要求:iOS13.0以上 重点:需要所有界面进行适配,工作量巨大,需要从项目开始就进行适配;H5界面无法进行适配   实现方式:System Colors(常用)、Semantic Colors(常用)、Dynamic Colors(常用)、Asset Catalog、Border colors、Dynamic Images   1.System Color…

    IOS 2023年4月17日
    00
  • 内存管理(二)之别小看了Tagged-Pointer关键时刻起到大作用

    本文主要研究Tagged Pointer技术,针对该技术需要解决的问题、以及在实际应用中的价值做一些简单的探讨。 如果你想要更进一步,去挖掘Tagged Pointer是如何实现的,可以参考Friday Q&A 2012-07-27: Let’s Build Tagged Pointers和objc源码。 另外,本文中涉及到的示例代码,请在真机iOS…

    IOS 2023年4月18日
    00
  • [Android开发学iOS系列] ViewController

    iOS ViewController 写UIKit的代码, ViewController是离不开的.本文试图讲讲它的基本知识, 不是很深入且有点杂乱, 供初级选手和跨技术栈同学参考. What is a View Controller iOS中的View Controller非常像Android中的Activity. 它负责用户界面的展示, 有一些生命周期的…

    IOS 2023年4月18日
    00
  • 使用SDLocalize高效完成iOS本地化国际化工作

    使用SDLocalize高效完成iOS本地化国际化工作 SDLocalize 该方案最大特点是对旧代码几乎没有较多修改就可以完成从单语言项目修改为多语言的项目。并支持XIB的控件本地化,无需创建不同语言版本的XIB文件。 SDLocalize的工作原理: 首先标记一组需要本地化的控件 然后在恰当时机(viewDidLoad),触发一组本地化任务(Then (…

    IOS 2023年4月17日
    00
  • iOS 组件化实施过程

    目录 一、组件化的优缺点 二、组件化的拆分 三、组件与组件之间如何进行通讯(路由) 四、从Cocopods拉取代码的过程 五、创建本地私有库 一、组件化的优缺点 二、组件化的拆分 三、组件与组件之间如何进行通讯(路由) 四、从Cocopods拉取代码的过程 远程索引库里很多的.spec文件,该文件记录了很多内容,如用户名,框架名称,描述,框架的地址 Podf…

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