C语言数组地址详解及相关题——各种奇奇怪怪的偏难怪

news2024/11/17 10:32:39

文章目录

  • 一、数组
  • 二、[]使用原理
  • 三、指针数组与数组指针
    • 指针数组
    • 数组指针
  • 四、数组名、*数组名与&数组名的区别
    • 一维数组
    • 二维数组
  • 空间移动计算
  • 总结


一、数组

数组(英文 array)就是一组同类型变量的集合。它具有三个特性:长度固定、连续存储,有序编号每个成员,编号最小为 0,最大为长度减 1。

变量是不能作为数组长度的。只能用整型常量才可以。

数组不完全初始化。即仅给出部分成员的值,其它未赋值的默认为 0。

数组名在一般情况下是指向数组中第一个对象的指针常量,也就代表其不能被修改。

这个一般,会在sizeof和&中会被破坏。

  1. 当数组名单独放在sizeof内部的时候会代表整个数组。
  2. 对数组名使用&取地址所产生的值的类型是一个指向整个数组的指针,而不是一个指向指针常量的指针

数组名+整数得到的是数组内某成员的地址。所以数组名+整数是数组成员间的移动。
数组名用&取地址运算后,得到的是整个数组类型(即 5 个 int 类型变量空间)的指针,所以再加 1 是整个数组类型的空间偏移。(后面会仔细谈这个问题)

一维数组的数组名是一个代表数组首元素的地址,一维数组名加整数是数组成员间的偏移,即指向某数组成员。

二、[]使用原理

[ ]不仅仅是数组的标志,其本身是一个运算符;优先级和( )一样,都是最高的优先级。其使用格式为:参照地址[偏移量]。
参照地址[偏移量] 等价于 * (参照地址+偏移量)。也就是 arr[1]背后的计算过程是* (arr+1)。也就是 arr 这个数组名代表的是数组首元素的地址,arr+1 代表从第 0 个成员地址开始偏移指向下标 1 成员的地址。* (arr+1)就代表下标 1 成员的空间。我们也可以理解成 arr[N]相当于* (arr+N)的快捷方式。

三、指针数组与数组指针

指针数组

int* p[4]是一个指针数组
int代表的是个 int 型指针,[4]是该类型变量数量的扩展,所以 int [4] 整体代表的是一个数组类型,即拥有 4 个成员的指针类型的数组(简称:指针数组)。

数组指针

int(* )[4]是一个数组指针
数组指针是对指针可以指向更大内存空间的扩展类型。
把数组名的位置用“(* )”代替,即 int(* )[4],其就可以是一个扩展空间了的指针类型,代表的是指向 4 个 int 的指针类型

四、数组名、*数组名与&数组名的区别

一维数组

数组名一般是首个成员的地址,所以数组名+整数是数组成员间的移动。

*数组名代表取数组的首元素,A = &A[0] * A = A[0] = * &A[0]

数组名用&取地址运算后,得到的是整个数组类型(即 5 个 int 类型变量空间)的指针,所以再加 1 是整个数组类型的空间偏移。

切记:

  1. 当数组名单独放在sizeof内部的时候会代表整个数组。
  2. 对数组名使用&取地址所产生的值的类型是一个指向整个数组的指针,而不是一个指向指针常量的指针。
    这是两种特殊情况
#include <iostream>

using namespace std;

int main()
{
	int nums[4] = { 0 };
	cout << nums << endl;
	cout << nums + 1 << endl;
	cout << *nums << endl;
	cout << *nums + 1 << endl;
	cout << &nums << endl;
	cout << &nums + 1 << endl;
}

在这里插入图片描述
解释:&num的类型是指向整个数组的指针,而num是指向num[0]的指针,虽然在数值上相同(结果的第1行和第5行),但是在类型上不同。所以+1所得到的值也不同。

一个是地址+4,这是因为移动了一个 int 类型的空间大小。
而另一个是+16,这是因为移动了一个数组(我这里数组大小是4),移动了4*4=16的空间大小。

二维数组

来看看二维数组,
其实+1中这个1代表的是当前数组最高维度的空间大小。
二维数组名字+1代表着偏移最高维度的大小。

#include <iostream>

using namespace std;

int main()
{
	int nums[4][3] = { 0 };
	cout << nums << endl;
	cout << nums + 1 << endl;
	cout << *nums << endl;
	cout << *nums + 1 << endl;
	cout << **nums << endl;
	cout << **nums + 1 << endl;
	cout << &nums << endl;
	cout << &nums + 1 << endl;
}

第一个+1代表着偏移最高维度的大小,即行的偏移,也就是+12
第二个+1代表着第一个元素的偏移,+4
第三个是元素值+1
第四个是移动了整个数组,即344=48
在这里插入图片描述

空间移动计算

建议:画个图!最好画个图!
要不然很容易乱
例:

//以下代码的执行结果是().
int main(){
   int a[5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   int* p = a;
   int (*p2)[2] = &a[1];
   ++p;
   ++p2;
   printf("%d\n", *p);
   printf("%d\n", **p2);
   printf("%d\n", p2[1][2]);
   return 0;
}

正确答案为:1,4,8
解释:
在这里插入图片描述
注意p2是一个含有两位的数组指针,每次移动是本身的大小(2)

例:
在头文件及上下文均正常的情况下,下列代码的运行结果是

int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2;
*(b + 2) = 2;
b++;
printf("%d,%d\n", *b, *(b + 2));

答案为2,4
在这里插入图片描述


总结

这就是我大概的理解,说实话数组这里小坑还是不少的,做题时候建议画图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 8.0 日志文件无权限问题处理

无论如何修改权限总是报这个日志文件权限问题。 解决方法 输入指令&#xff1a; setenforce 0 systemctl restart mysgld

解答关于:水牛社软件是做什么的?水牛社软件靠谱么?

很多对我们软件感兴趣但是没有入手的观望者都会有这样的疑问&#xff1a;水牛社软件具体是做什么的&#xff1f;水牛社软件靠谱么&#xff1f; 其实软件的简介已经讲的很清楚了&#xff0c;但是软件不是功能性软件&#xff0c;所以不能给大家免费试用&#xff0c;短期任务版块…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年&#xff0c;百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后&#xff0c;百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态&#xff0c;“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…

老司机都懂的!【打赏】完美运营的最新视频打赏系统

完美运营的最新视频打赏系统优于市面上95%的打赏系统&#xff0c;与其他打赏系统相比&#xff0c;功能更加强大&#xff0c;完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介&#xff0c;经测试验证。成功搭建并可以正常进入…

Linux环境下安装nmp(Centos环境)保姆级教学 一步到位

在CentOS上安装npm&#xff0c;您需要先安装Node.js&#xff0c;因为npm是Node.js的包管理器。以下是安装步骤&#xff1a; 更新系统软件包&#xff1a;在安装Node.js之前&#xff0c;建议先更新系统软件包&#xff0c;以确保安装的是最新版本的软件包。运行命令 sudo yum upda…

DetNet论文速读

paper&#xff1a;DetNet: A Backbone network for Object Detection 存在的问题 最近的目标检测模型通常依赖于在ImageNet分类数据集上预训练的骨干网络。由于ImageNet的分类任务不同于目标检测&#xff0c;后者不仅需要识别对象的类别&#xff0c;而且需要对边界框进行空间…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

SPSS直接输出三线表

STEP1 下载三线表.stt至安装目录的Looks文件夹 STEP2 在SPSS菜单栏中找到 编辑-选项-透视表 表外观下拉到最底&#xff0c;选择三线表&#xff08;如果第一步没保存对是不会出现的&#xff09;&#xff0c;然后点击确定 效果&#xff1a;

穿越牛熊,股市的春天还有多远?

2023年&#xff0c;资本市场的严冬令无数投资者和机构投资者都感受到了前所未有的压力。VC/PE、公募基金、股权投资类公司等机构&#xff0c;在这一年里业绩普遍不佳&#xff0c;寒意弥漫。VC/PE机构的营业收入普遍呈现负增长&#xff0c;公募基金更是历史上首次连续两年亏损&a…

牛客网 华为机试 合唱队

本题抽象出来&#xff0c;我们需要找到最长递增子序列&#xff0c;还需要一个最长递减子序列&#xff0c;然后两个子序列的长度相加减去1就是我们这个合唱队的最大长度。然后我们用所有的人数减去合唱队最大长度&#xff0c;就是我们要求的最少需要几位同学出列。 这个题和上一…

JavaWeb - 3 - JavaScript(JS)

JavaScript(JS)官方参考文档&#xff1a;JavaScript 教程 JavaScript&#xff08;简称&#xff1a;JS&#xff09;是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为的&#xff0c;它能使网页可交互&#xff08;脚本语言就不需要编译&#xff0c;直接通过浏览器…

Java数组常用操作

创建数组 int[] a {1,2,3};int[] a new int[]{1,2,3};int[] a new int[3];ArrayList<Integer> arr new ArrayList<>(); 添加元素 arr.add(99); //将99加入到数组末尾arr.add(3,99); //将99加入到指定索引3处访问元素 int c1 c[1]; int arr1 arr.get(1); …

基于PHP的汽车能耗优化系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 ThinkPHP框架 3 1.2 MySQL数据库 3 1.3 Vue框架 3 1.4 Bootstrap 3 1.5 Highcharts 3 1.6 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 6 2.3 非功能需求 8 2.4 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 3.…

C++的类与对象(二):this指针

目录 结构体内存对其规则 相关面试题 this指针 相关面试题 右箭头选择运算符-> C语言和C实现Stack的对比 结构体内存对其规则 1、第一个成员在与结构体偏移量为0的地址处 2、其它成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处 对齐数 编…

Jumpserver 使用

目录 1、邮箱设置 2、用户管理 创建用户组 创建用户 3、资产管理 创建被管理机器的账号 添加资产 测试资产联通 推送账号 4、权限管理 资产授权 建命令过滤器 测试 使用 Xshell 登录 5、查看命令记录 查看回放 1、邮箱设置 修改当前站点的URL为本机IP或者jumps…

3.8题目练习

1.数的计算 题目其他部分&#xff1a; 这道题目可以先试着自己推一下找一下规律&#xff0c;题目给出的数字是一个小于等于一千的数字&#xff0c;这里我们不妨考虑一下从小往大推&#xff0c;我们从1开始&#xff0c;用f[i]来表示对应i共有几个合法的序列&#xff1a; 当n为1…

设计模式大题做题记录

设计模式大题 09年 上半年&#xff1a; 09年下半年 10年上半年 10年下半年 11年上半年 11年下半年 12年上半年 12年下半年 13年上半年 13年下半年

MindOpt优化器: 浅谈版本0.x和1.x之间API的差异

Mindopt 是一个优化求解器&#xff0c;如果它有两个主要版本——0.xx和1.x.x&#xff08;最新版本1.1.1&#xff09;&#xff0c;它们代表着软件开发的两个不同阶段。版本1.0.0表示软件的一个大的里程碑&#xff0c;代表着软件第一个正式的“成熟”发布版本&#xff0c;而0.25是…

用开发CesiumJS模拟飞机飞行应用(一,基本功能)

本部分向您展示如何构建您的第一个 Cesium 应用程序&#xff0c;以可视化模拟从旧金山到哥本哈根的真实航班&#xff0c;并使用 FlightRadar24收集的雷达数据。您将学习如何&#xff1a; 在网络上设置并部署您的 Cesium 应用程序。 添加全球 3D 建筑物、地形和图像的基础图层。…

高校水电预付费系统有什么作用?

Hey小伙伴们&#xff0c;今天来聊聊咱们大学里的一个超级实用的设施——水电预付费系统&#xff01;你是不是还在为每个月的水电账单烦恼呢&#xff1f;别担心&#xff0c;这个系统就是你的生活小帮手&#xff01; 首先&#xff0c;想象一下这 样的场景&#xff1a;开学初&…