首页 > 编程语言 >程序设计分组训练实验一

程序设计分组训练实验一

时间:2024-09-20 10:12:55浏览次数:9  
标签:指向 训练 int 数组名 分组 数组 程序设计 sizeof 指针

实验一必备知识

csdn-vs调试

[bilibili生成目录word]
https://www.bilibili.com/video/BV1V14y1t73F/?share_source=copy_web&vd_source=668d4d374b623b9a00fbe541e1b24f78

数组指针退化

数组名一旦充当地址,就会退化!!!

  1. 数组名作为函数参数传递时
    • 当把数组名作为函数参数传递给函数时,数组名会退化为指向数组首元素的指针。例如:
    void func(int arr[]) {
        // 这里的arr实际上是一个指针,等价于int* arr
    }
    
    int main() {
        int a[5];
        func(a);
        return 0;
    }
    
    • 在这个例子中,amain函数中是一个数组名,代表整个数组。但是当它被传递给func函数时,a就退化为一个指向int类型的指针(int*),在func函数内部,arr不再具有数组的长度信息等数组特性,仅仅是一个指针。
  2. 使用取地址运算符&取数组名的地址(取整个数组的地址)之外的情况
    • 在表达式中,如果数组名不是取整个数组的地址(&数组名)的情况,数组名都会退化为指向首元素的指针。例如:
    int a[5];
    int* p=a; // 这里a退化为指向首元素的指针,所以可以赋值给int*类型的p
    
    • 另外:
    int a[5];
    sizeof(a); // 这里a表示整个数组,结果为5 * sizeof(int)
    
    • 但是如果写成:
    int a[5];
    int* p = a;
    sizeof(p); // 这里p是指针,结果为sizeof(int*)
    

sizeof()是操作符,不会引发数组退化

sizeof是一个编译时操作符,它的作用是获取操作数所占用的字节数。当操作数是数组名时,sizeof会将数组名视为整个数组对象,而不是指向数组首元素的指针。
在 C 语言中,数组的大小是其类型的一部分。例如,对于int a[5];,数组a的类型是int[5],这个类型信息在编译时是确定的。
当计算sizeof(a)时,编译器根据数组的定义直接计算出整个数组所占用的字节数,即5 * sizeof(int)(假设sizeof(int)为 4 字节,那么sizeof(a)为 20 字节)。

关于数组名

1. 对于二维数组int a[4][4]

  • 从数组的存储角度来看,二维数组在内存中是按行顺序存储的,a可以看作是一个指向包含4个int元素的数组的指针(即a的类型是int(*)[4])。

2. 分析*a + 1

  • 根据运算符优先级,*的优先级高于+
  • 首先,*a等价于a[0],它是指向数组a的第一行(即a[0]是一个包含4个int元素的数组,在这里它会退化为指向该数组首元素的指针,类型为int*)。
  • 那么*a+1就是在a[0]的基础上偏移一个int类型的单位。如果a的起始地址为0x1000(假设),a[0]的值也是0x1000(因为a[0]是第一行数组的首地址),*a + 1的值就是0x1000 + sizeof(int)(假设sizeof(int)=4,则值为0x1004),它指向了a[0][1]这个元素。

3. 分析*(a + 1)

  • 这里a+1表示将指针a(类型为int(*)[4])向下移动一行(因为指针的偏移量是sizeof(int[4]))。如果a的起始地址为0x1000a+1的值就是0x1000+sizeof(int[4]) = 0x1000 + 16(假设sizeof(int)=4),它指向了数组a的第二行(即a[1])。
  • 然后*(a + 1)就等价于a[1],它是一个包含4个int元素的数组,同样会退化为指向该数组首元素的指针(类型为int*),它指向a[1][0]这个元素。

()和[]

[]优先级高于()

  1. 对于(*(a + 2))[3]
    • 根据C语言中数组和指针的运算规则:
      • a是一个二维数组名,它可以被看作是一个指向数组(这个数组包含4个int元素)的指针。
      • a+2表示将指针a向后移动2个“单位”,这里的“单位”是指包含4个int元素的数组的大小。所以a + 2指向二维数组a中的第三行(行索引从0开始)。
      • *(a + 2)就是取a+2所指向的那一行数组。
      • 最后(*(a + 2))[3]表示取这一行数组(也就是第三行)中的第4个元素(列索引从0开始),在给定的初始化中a[2][3]=12
  2. 对于*(a + 2)[3]
    • 根据运算符优先级,先计算(a + 2)[3]
      • (a+2)是一个地址,(a + 2)[3]等价于*((a + 2)+3)。这表示将a + 2这个地址再向后移动3个“单位”(每个单位是包含4个int元素的数组的大小),然后取这个地址指向的内容。实际上,这是越界访问,因为原始的二维数组a只有4行,这样的计算导致访问到了非法的内存区域。
      • 然后再对这个非法访问得到的结果进行间接访问(*操作),由于访问的是非法内存,所以得到的是一个未定义的值,这里显示为-858993460,这个值是完全不可预测的,不同的编译器、不同的运行环境可能会得到不同的结果。

标签:指向,训练,int,数组名,分组,数组,程序设计,sizeof,指针
From: https://www.cnblogs.com/sunrise0307/p/18421605

相关文章

  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状
    【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??文章目录【深度学习|可视化】如何以图形化的方式展示神经......
  • Java中的自适应学习率方法:如何提高训练稳定性
    Java中的自适应学习率方法:如何提高训练稳定性大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在机器学习和深度学习模型训练过程中,学习率是一个至关重要的超参数。不同的学习率会直接影响模型的收敛速度和性能。然而,固定的学习率往往难以应对复杂的......
  • 河南省第十五届ICPC大学生程序设计竞赛 F
    题目链接题目描述给你一个正整数MMM请你求出一个最小的正整数NN......
  • C语言程序设计(进阶)
    肆意张扬的我们都不会是烂尾的诗集。2.整型在内存中的存储我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同类型而决定的。2.1原码、反码、补码数值有不同的表现形式:2进制、8进制、10进制、16进制其中整数的2进制表示也有三种形式:原码、反码、......
  • C语言程序设计(进阶)
    行到水穷处,坐看云起时。中秋快乐呀!数据在内存中的存储1.数据类型的介绍(1)基本的内置类型:·char       //字符数据类型·short     //短整型·int        //整型·long       //长整型·longlong  //更长的整......
  • 2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单
    目录1MySQL数据库基本操作-DQL-基本查询1.2SQL概述1.3SQL类2.SQL语言的规则与规范2.1基本规则2.2SQL大小写规范推荐采用统一的书写规范:2.3注释2.4命名规则(了解即可)举例:两句是一样的,不区分大小写创建表格order使用``飘号,因为order和系统关键字或系统函数名......
  • Java语言程序设计基础篇_编程练习题**18.31 (替换单词)
    目录题目:**18.31(替换单词)习题思路代码示例 运行结果替换前替换后题目:**18.31(替换单词) 编写一个程序,递归地用一个新单词替换某个目录下的所有文件中出现的某个单词。从命令行如下传递参数:javaExercise18_31dirNameoldWordnewWord习题思路(读取路径方......
  • (6-2-02)模型训练:文生图大模型的训练策略(2)对比学习+数据增强+迁移学习
    6.2.4 对比学习对比学习(ContrastiveLearning)通过构造正负样本对,让模型学习到不同模态之间的相似性和差异性。例如,在“图像-文本”匹配任务中,可以使用对比学习方法让模型区分匹配和不匹配的“图像-文本”对。请看下面的例子,演示了使用对比学习方法训练模型来学习“图像-文......
  • 代码随想录算法训练营,9月19日 | 39. 组合总和,40.组合总和II,131.分割回文串
    39.组合总和题目链接:39.组合总和文档讲解︰代码随想录(programmercarl.com)视频讲解︰组合总和日期:2024-09-19想法:组合总和类型题,允许重复使用元素,递归不+1就行。Java代码如下:classSolution{List<Integer>path=newArrayList<>();List<List<Integer>>res=n......
  • 使用腾讯云 GPU 云服务器训练 ViT 模型
    ViT模型简介ViT全称VisionTransformer,该模型由AlexeyDosovitskiy等人提出,在多个任务上取得SoTA结果。示意图如下:对于一幅输入的图像,ViT将其划分为多个子图像patch,每个patch拼接positionembedding后,和类别标签一起作为TransfomerEncoder的一组输入。而类别标签位......