c语言二维数组储存点坐标,C++二维数组中数组元素存储地址的计算疑问讲解

关于二维数组中数组元素的存储地址,有同学问出了个好问题。

在我的课件中,出现了下面的讲解:

64f63d74bc624062247ad7617f76c4aa.png

a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数)。

同学编程序进行验证,出问题了:

775dcb939e1a35c3ddcf165262c8ae3c.png

地球停止转动了也必须先赞这种学习方式!

同学问:“老师,第一张图的4,我怎么觉得不对呢?第二张图我没4,结果好像也对,这里面差在哪呢?”

我的答复:“两个都对。”

第一张图在讲原理,是我们在人脑里面要以“字节”为单位计算,p为首地址,单位是字节,再往后多少个字节,必须考虑到在整型数组中每个数组元素占4个字节,从首地址到a[i][j]有(i*col+j)个元素,计算其字节地址时,乘4是必要的。

第二张图是在计算机中的运行结果,是已经在计算机内按找第几“个”数组元素为单位计算地址值了,*4的操作,是在寻址中已经计算过了,在此直接输出结果。

更直白地,第一张图中的“p+”中的加,和我们日常算术中的加一样,我们按“字节”说事;而第二张图中的“p+”,是C语言中指针的加运算,是增加一个单元,究竟多少字节,还要考虑指向的元素的数据类型,在32位系统中,对于整型,一个单元4字节,而对于double型,一个单元8字节。

两个加号形状一样,含义是不同。

这个问题,学C/C++的同学才可能会遇到,学习C/C++中主动寻疑验证的同学才会遇到。可见学C/C++的价值,可见主动寻疑验证的价值。

想起离散数学中的代数结构,用符号任意地表达运算,研究或设计运算系统,好一个“让思绪飞扬”和”精彩世界“,一不留神却成了“枯燥乏味”和“与实践无关”。

能从不同层面,不同视角看问题,这就是自由。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴回答您的问题:C语言字符串二维数组的值交换可以使用嵌套循环来实现,嵌套循环使用两个索引来遍历数组的每个元素,并将每个元素与另一个元素进行交换。例如,可以使用如下代码实现:for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { // 交换两个元素 char tmp = arr[i][j]; arr[i][j] = arr[i+1][j+1]; arr[i+1][j+1] = tmp; } } ### 回答2: 要交换C++的二维字符数组(C string),可以按照以下步骤进行操作: 1. 首先,需要定义一个二维字符数组。例如,我们可以定义一个3行4列的字符数组: ```cpp char arr[3][4] = { {'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h'}, {'i', 'j', 'k', 'l'} }; ``` 2. 接下来,选择要交换的两个元素的坐标。例如,我们要交换第一行第一列的字符和第三行第四列的字符: ```cpp int row1 = 0; // 第一个元素的行索引 int col1 = 0; // 第一个元素的列索引 int row2 = 2; // 第二个元素的行索引 int col2 = 3; // 第二个元素的列索引 ``` 3. 然后,可以使用一个临时变量来交换两个元素的值。将第一个元素的值存储到临时变量,然后将第二个元素的值赋给第一个元素,再将临时变量的值赋给第二个元素。例如: ```cpp char temp = arr[row1][col1]; arr[row1][col1] = arr[row2][col2]; arr[row2][col2] = temp; ``` 4. 最后,可以打印输出交换后的数组,以验证交换是否成功。例如: ```cpp for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { cout << arr[i][j] << " "; } cout << endl; } ``` 以上就是使用C++交换二维字符数组元素值的步骤。具体交换哪两个元素以及打印输出的部分可以根据实际需求进行调整。 ### 回答3: 在C语言,要实现对二维字符数组(String)的值进行交换,可以使用循环和临时变量进行操作。 首先,需要确定要交换的两个位置,可以是行、列或者具体的元素。然后,可以使用一个临时变量来存储一个位置的值,然后将该位置的值赋给另一个位置,再将临时变量的值赋给另一个位置,从而实现交换。 下面是一个示例代码,假设有一个3x3的二维字符数组CString: ```c #include<stdio.h> void swap_char(char* a, char* b){ char temp = *a; *a = *b; *b = temp; } void swap_2D_char_array(char arr[][3], int row1, int col1, int row2, int col2){ swap_char(&arr[row1][col1], &arr[row2][col2]); } int main(){ char CString[][3] = { {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'} }; swap_2D_char_array(CString, 0, 1, 2, 1); // 交换CString[0][1]和CString[2][1] for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ printf("%c ", CString[i][j]); } printf("\n"); } return 0; } ``` 运行结果应该是: ``` a b c g e f d h i ``` 这段代码的作用是交换CString二维数组(0,1)和(2,1)两个位置的值,即将数组的'b'和'h'进行交换,最终输出交换后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值