首页 > 其他分享 >C ——— 指针笔试题(最终篇)

C ——— 指针笔试题(最终篇)

时间:2024-08-03 20:53:59浏览次数:12  
标签:元素 ++ 最终 笔试 地址 数组 cpp cp 指针

指针加减整数和解引用的笔试题

boss题:

char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;

printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);

代码解析:

c数组中存放了4个元素,每个元素是char*类型的地址,c数组并不是存放的4个常量字符串,而是存放的每个字符串的首字符的地址,所以c数组的每个元素是char*

cp数组中存放的是4个char** 类型的元素,c + 3 指向的是 "FIRST" 这个常量字符串中的 'F' 字符的首地址,c + 2 指向的是 "POINT" 这个常量字符串中的 'P' 字符的首地址,c + 1 指向的是 "NEW" 这个常量字符串中的 'N' 字符的首地址,c 指向的是 "ENTER" 这个常量字符串中的 'E' 字符的首地址

cpp数组存储的是cp数组的首元素地址

各个数组的关系示意图:

解析:**++cpp 

cpp 指向的是cp数组首元素地址,++cpp后指向了 cp数组第二个元素的首地址,*++cpp 解引用后找到的是 cp数组中 存储的第二个元素的地址,也就是 c + 2,**++cpp再次解引用后找到的就是c数组中的第三个元素的地址,以%s的形式打印,打印的就是c数组中的第三个常量字符串

所以 **++cpp 以%s的形式打印的结果是 "POINT" 

注意: ++cpp时,cpp就已经发生了改变,在此之后的cpp就指向了cp数组第二个元素的首地址

解析:*-- * ++cpp + 3

解析这个的结果之前,先要了解 ++ 和 * 和 -- 的优先级都高于+,所以要从cpp开始依次往左计算,最后再算 + 3 

此时的cpp指向的是cp数组中第二个元素的首地址,再次++cpp后,指向的就是cp数组中第三个元素的首地址,*++cpp 解引用后就拿到了 c + 1,也就是c数组第二个元素的首地址,--*++cpp 前置减减后就指向了c数组中第一个元素的首地址,*--*++cpp 解引用后拿到的是c数组中第一个常量字符串的首地址,最后再 +3,也就是从 "ENTER" 的首字符 'E' 中向后跳过 3个字符,得到的就是字符串 "ER"

所以 *-- * ++cpp + 3 以%s的形式打印的结果是 "ER"

注意:此时的cpp已经指向了cp数组中第三个元素的首地址

解析:*cpp[-2] + 3

[] 的优先级高于 * ,所以cpp先和[-2]结合,cpp[-2] 等价于 *(cpp - 2) ,cpp - 2后指向的是cp数组第一个元素的地址,*(cpp - 2) 解引用后找到的是 cp数组的第一个元素,也就是c + 3,*cpp[-2] 解引用后找到的是 c数组中的第四个元素,也就是 "FIRST" 中 'F' 字符的首地址,最后再+3,也就是从 'F' 字符向后跳过 3个字符,打印的就是 "ST"

所以 *cpp[-2] + 3 以%s的形式打印的结果是 "ST"

解析:cpp[-1][-1] + 1 

cpp[-1][-1] 等价于 *(*(cpp - 1) - 1) ,此时的cpp指向的是cp数组中第三个元素的首地址,cpp - 1后指向的是 cp数组中第二个元素的首地址,*(cpp - 1) 解引用后找到的是cp数组中的第二个元素,也就是c + 2 ,*(c + 2 - 1) 得到的是c数组中第二个元素,也就是 "NEW" 字符串,最后再加1,也就是从 'N' 字符向后跳过一个字符,指向的就是 "EW"

所以 cpp[-1][-1] + 1 以%s的形式打印的结果是 "EW"

标签:元素,++,最终,笔试,地址,数组,cpp,cp,指针
From: https://blog.csdn.net/weixin_55341642/article/details/140854707

相关文章

  • 【C++BFS】802. 找到最终的安全状态
    本文涉及知识点C++BFS算法LeetCode802.找到最终的安全状态有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一......
  • 招商银行笔试题目答案解析
    招商银行笔试题目:笔试题库:1.测试流程,静态测试和动态测试的区别?静态测试和动态测试的区别:是否执行代码,执行代码是动态,不执行是静态人工检查2.http协议的标识符有哪些?什么含义,TCP连接两台设备间通过一一连接,TCP报文头部相关的,结构,长度,2层循环计算题,除法取余数运算?UR......
  • 塔子哥的最短区间-小米2023笔试(codefun2000)
    题目链接塔子哥的最短区间-小米2023笔试(codefun2000)题目内容塔子哥有一个长度为n的数组a和长度为m的数组b,下标均从1开始。现在,塔子哥想让你找出一个最短的区间l,r,这个区间中数x的数量至少出现了b[x]次。输入描述第一行,两个整数n,m(......
  • C++学习笔记之指针高阶
    数组名数组名字是数组的首元素地址。一个指针变量保存了数组元素的地址。我们就称之为数组元素指针,及数组指针。数组指针的本质是指针,指向数组中的某个元素的地址。 由于数组名可以代表数组收元素地址,数组元素是可以通过 数组名[下标]的格式访问,那么可以定义一个指针......
  • C语言指针与数组
    在上一篇对指针介绍的文章当中,我们初次了解到了指针,并且知道了地址和内存间的关系,懂得了如何取地址和对指针的解引用,算是对指针有了一个初步的了解。而今天让我们对指针进行更深一步的了解吧~一、指针与数组名我们知道,指针变量是一个用来存放地址的变量,比如我们定义一个整形......
  • 函数指针和指针函数的使用
    指针函数1:本质函数,返回值为指针1.2:格式:数据数据*函数名(形参){函数体return地址;//失败一般会返回NULL}#include<stdio.h>#include<stdlib.h>char*yue(){//chara[32]="hello";//栈区,函数调用结束后空间被释放//char*s="hello";//常量区,不会被释......
  • 1990-2022年 上市公司-战略差异度(原始数据、计算代码、参考文献和最终计算结果)
    上市公司战略差异度是衡量企业在战略制定和实施过程中所展现的独特性和创新性的指标。它体现了公司对市场环境、行业趋势及自身能力的独特见解和战略布局。通过分析上市公司的战略差异度,可以深入理解企业的市场竞争策略、行业定位和发展方向。战略差异度的重要性市场竞争力:战......
  • 2000-2022年 上市公司-投融资期限错配、短债长用、短贷长投(原始数据、计算代码、参考
    上市公司在投融资过程中的管理决策对企业的财务稳定性和长期发展至关重要。投融资期限错配、短债长用和短贷长投是企业在资本运作中可能出现的问题,它们影响着企业的财务结构和风险管理。投融资问题概述投融资期限错配指企业资产与债务的期限不匹配,通常表现为资金来源短期化......
  • 【C++】引用和指针的不同点
    引用和指针的不同点:(从使用的角度去对比,按自己的理解的角度去梳理,硬记很难记全,虽然不赢记大概率也记不全)1.引用概念上定义一个变量的别名,指针存储一个变量地址。2.引用在定义时必须初始化,指针没有要求。3.引用在初始化时引用一个实体后,就不能再引用其他实体;而指针可以在......
  • c语言中的地址与指针的概念,及变量的指针和指向变量的指针变量
    C语言中的地址、指针、以及变量的指针与指向变量的指针变量。1.地址(Address)在C语言中,每个变量在内存中都有一个唯一的内存地址。这个地址是变量存储的位置的标识符。可以通过& 运算符来获取一个变量的地址。#include<stdio.h>intmain(){  intx=10;  ......