二维数组的地址表示方式 如数组:int a[3][3] = {1,3,5,7,9,11,13,15,17}; 等价于:int a[3][3] = {{1,3,5},{7,9,11},{13,15,17}} 注意: 每一行都对应一个行地址,二维数组的地址就是第一行地址 二维数组名字本来就是地址即: 行地址: a是第一行地址 a+1是第二行地址 a+2是第三行地址 列地址: a[0]+0第一列地址 a[0]+1第二列的地址 a[0]+2第三列的地址
具体项目地址如: a[1][2]的地址:为以下三种表示方式 1. a[1]+2; 2. *(a+1)+2 3. &a[1][2] a[1][2]里面的值:为一下三种表示方式 4. *(a[1]+2) 5. ((a+1)+2) 6. a[1][2]
a[]或(a+1)//行地址a[]+i //行地址加列地址Test代码如下所示:
#include<stdio.h>int main(void){ int nums[3][3] = {1,3,5,7,9,11,13,15,17}; /**第一行地址*/ PRintf("%p,%p,%p,%p/n",nums,nums[0],*nums,&nums[0]); /*第二行地址*/ printf("%p,%p,%p,%p/n",nums+1,nums[1],*(nums+1),&nums[1]); /*a[2][1]的值*/ printf("%d,%d,%d,%d/n",*(nums[2]+1),nums[2][1],*(*(nums+2)+1),*(&nums[2][1])); /*第一行第一列的值*/ printf("%d,%d/n",*(*nums),**nums); return 0;} &和*连用的时候是可以整体进行省略的 &在二维数组中的含义是:地址升阶 即&(第一列地址)--------->会将地址升阶成行地址 *运算符在二维数组中的另外一种含义就是:地址降阶 如:a+1代表第二行地址(行地址) *(a+1)代表的是(第二行第一列的地址)(列地址) *(a+1)+2代表第二行第三列地址,** 其顺序是由(某一行地址--->某一行地址第一列地址---->某一行地址到具体列数的地址) 即 行地址加指针指针运算符拿到的是列地址,列地址再加指针运算符拿到的是某一行某一列地址中的值;**列地址加上一个取地址运算符&,就变成了行地址%p是地址输出printf("%p/n",a[1]+2);行地址也可以称为行指针列地址也可以称为列指针注意:二维数组中每一行的行地址和每一行第一列地址是一样的,但是其含义是完全不一样的,一个是行地址,没有进行降阶处理,而列地址是二维数组的指针遍历方式: 1:下表发去遍历二维数组 2;列地址去遍历: 根据二维数组在内存中按行去连续分配内存空间的,所以可以通过列指针去遍历二维数组;
对于二维数组来说; *a就是第一行第一列的地址*(a+0)+0;代码能够run,如果有需要的话,可以直接拉下来run一下,看看结构体数组是怎么进行初始化操作和使用的。谢谢大家的访问,如有写的不好的地方,希望大家能够及时的提出来,谢谢观看
新闻热点
疑难解答