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。

C C++指针面试题零碎整理的更多相关文章

  1. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  2. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  3. java 开发面试题小整理(一)

    本篇文档将持续更新,有基础滴,也有深层次的,谢谢! 1.看下面的程序是否有问题,如果有问题,请指出并说明理由. * byte b1 = 3; * byte b2 = 4; * byte b3 = b1 ...

  4. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  5. (C++) 基本面试题(整理)

    1.new.delete.malloc.free关系 new/delete是C++的运算符.new 调用构造函数用于动态申请内存,delete调用对象的析构函数,用于释放内存. malloc与free ...

  6. C语言面试题大汇总之华为面试题 Eddy整理

    1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...

  7. 【css】cursor鼠标指针光标样式知识整理

    在前端开发中,我们经常需要对对象鼠标指针光标进行控制,比如鼠标经过超链接时变成手指形状.在这里整理一下cursor鼠标指针光标样式的知识,记录与方便以后查找. 1.常用cursor光标 div( cu ...

  8. Java面试题汇总---整理版(附答案)

    今天继续为大家整理Java面试题,并涉及数据库和网络等相关知识,希望能帮助到各位开发者. 1,为什么要用spring,Spring主要使用了什么模式? spring能够很好的和各大框架整合,它通过IO ...

  9. 2019Flutter面试题最新整理大全(含答案)

    一.前言2019年行将结束,也该规划一下自己的职业生涯了:是选择继续从事Android(Android的话已经火了几年了,现在算是进入寒冬了,需要考虑清楚)?还是学习新的跨平台开发Flutter技术? ...

  10. 多线程用this指针来传递参数(整理)

    整理自CSDN的论坛中,地址:https://bbs.csdn.net/topics/390703249 1.不同的线程不是两个独立的程序:线程不是进程(process是你说的程序) 2.线程函数必须 ...

随机推荐

  1. [转帖]使用 Crash 工具分析 Linux dump 文件

    前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪.开发者认为,内核如果发生了错误,就不应该继续运行.因此内核发生错误时,它的行为通常被设 ...

  2. 【DP】DMOPC '21 Contest 8 P5 - Tree Building

    Problem Link 给定 \(n,m\) 和一个长为 \(m\) 的代价序列,对于一棵 \(n\) 个节点,每个节点度数不超过 \(m\) 的树,定义它的代价为 \(\sum\limits_{i ...

  3. 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑

    英伟达系列显卡大解析B100.H200.L40S.A100.A800.H100.H800.V100如何选择,含架构技术和性能对比带你解决疑惑 近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力 ...

  4. python快速入门【一】-----基础语法

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  5. PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]

    PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十] 1.PGL图学习项目合集 1.1 关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] :ht ...

  6. 使用s3fs-fuse挂载minio文件时无法删除问题排查过程

    使用s3fs-fuse挂载minio文件时无法删除问题排查过程 结论:部分场景无法满足,具体问题详见正文 1. 部署minio docker run    -p 9000:9100    -p 909 ...

  7. Redis安装,数据类型及常用命令

    安装 - 可以使用yum 安装,要先配置epel源 ``` yum install -y redis ``` - 可以编译安装 ``` wget http://download.redis.io/re ...

  8. 推荐一款接口自动化测试数据提取神器 JSonPath

    在之前分享中,给大家介绍过一篇:如何快速审核接口返回值全部字段解决方案,详见原文:接口自动化测试,一键快速校验接口返回值全部字段 .当时,提到解决这类问题,市面上常见的解决方案有两种: 根据业务校验需 ...

  9. C#合成图片显示不全

    现象 前段时间用C#写了一个小工具,主要功能是随机读取图片并合成一张长图.最近在使用的时候发现个问题,原图片宽度是1080,合成后的图片宽度也是1080,但是合成后的图片没有显示全,就像下面这样 原图 ...

  10. 使用symbolicatecrash工具符号化Crash日志

    对于打包上线的APP,或者打包测试的APP,出现了崩溃并不能方便的把手机链接到电脑使用XCode自动符号化,此时手动符号化就是重要的选项. 1.查找符号化工具symbolicatecrash find ...