指针和数组笔试题深度解析(下)二

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 指针和数组笔试题深度解析(下)

题六


#include <stdio.h>
int main()
{
  int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  int* ptr1 = (int*)(&aa + 1);
  int* ptr2 = (int*)(*(aa + 1));   //aa代表首元素地址即aa[0]的地址,+1就是a[1]的地址
  printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
  return 0;
}


输出:10,5

不多解释了


题七


#include<stdio.h>
int main()
{
  char* a[] = { "work","at","alibaba" };
  char** pa = a;
  pa++;
  printf("%s\n", *pa);
  return 0;
}


输出:at

分析:a[0]存放‘w’的地址,a[1]存放‘a’的地址,a[2]存放‘a’的地址,如图(两个a地址不同,由首字符地址可以找到该字符串)


1fad96a3c88c43b7b95aa9a9ad20a0b4.png


pa++,原来pa指向a[0],现在指向a[1],解引用得到a[1]的内容即地址,打印字符串得到 at


题八(稍难)


注意题中的++、- - 哦!


#include <stdio.h>
int main()
{
  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);
  return 0;
}

输出:


fcf628fd03c74384bef9537e3d432ae4.png


相信大家应该都有所疑惑吧,下面我们来分析一下:


char* c[] = { "ENTER","NEW","POINT","FIRST" };


由该代码可以画出下图:


45641760615a41efb76559c608b30b57.png


char** cp[] = { c + 3,c + 2,c + 1,c };
  char*** cpp = cp;


由此又可以得到下图:


332dd33029bd4312818e96a8c806d601.png


printf("%s\n", **++cpp);


cpp先++,再解引用,++就改变了cpp里存放的地址,使原本指向cp[0]的指针++变为指向cp[1],如图:


92e3f88dce3b4b6c95beb0351bd2afe6.png


解引用得到c[2]的地址,解引用得到字符‘P’的地址,打印就是:POINT


printf("%s\n", *-- * ++cpp + 3);


cpp在原来基础上再++,如图:


95997bab52934ae299fe45203dc92003.png


cpp解引用得到cp[2],–cp[2]就是将cp[2]里的地址–,所以cp[2]里地址指向了c[0],如图。解引用得到的地址指向字符‘E’,加3个字节就指向了字符E,打印字符串为ER


e0350d8a23194be5857492496aee68cc.png


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


经由几次++后,cpp指向cp[2] ,cpp[-2]可以写出*(cpp-2) ,得到cp[0],也就是c[3]的地址,再解引用得到字符‘F’的地址,加3得到‘S’的地址,打印字符串得到 ST


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


cpp[-1][-1] 可以写成*(*(cpp-1)-1) ,cpp-1得到cp[1]的地址,解引用得到c[2]的地址,再-1得到c[1]的地址,解引用得到字符‘N’的地址,加一字节,得到字符‘E’的地址,打印字符串,得到EW


好了关于指针的系列就告一段落了,相信大家应该收获满满吧,下期见了~


相关文章
|
3月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
62 3
|
2月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
116 1
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
3月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
3月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
84 4
|
3月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
65 2
|
3月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
53 1
|
4月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
100 5

推荐镜像

更多