当前位置:首页 » 编程语言 » c语言数组行地址和列地址
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言数组行地址和列地址

发布时间: 2022-05-19 13:25:04

‘壹’ c语言,二维数组str[3][4],那么str[i]表示的到底是i行0列元素地址还是整个i行的地址

str[3][4表明,str是一个二维数组,共有3行,每行有4个元素。在C/C++中,二维数组元素是按行存放的,就是说,第二行的第一个元素排在第一行最后元素的后面,顺序是:
str[0][0],str[0][1],str[0][2],str[0][3],str[1][[0],str[1[][1],str[1][2],str[1][3],str[2][0],str[2][1],str[2][2],str[2][3]
str[i]表示第i行的首地址,str[i] = &str[i][0],str[i] = &str[0][0] + 4 * i + 0。

‘贰’ C语言二维数组地址问题

1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?

>>正确, a[0]就是0行首地址.

&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?

>>&a[0]值上, 是和a[0]相同的, 不过类型不一样. a[0]等效于int *型,实际上是指向一个元素. 而&a[0]是行指针, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的.

+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?

>>+n取决于原始指针的类型. 如果是a[0]+n 移动的是n个元素.而&a[0]+n就是移动n行了.

然后*(a[n]+m)就表示n行第m个元素了?

>>这句没错. 任何情况下, *(p+n)都等效于p[n]
2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?

>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型, 也就是数组指针. 移动的时候是整行移动的.

还是a+n表示n行首个元素的地址?为什么

>>同上
*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?

>>*(a+n)与a[n]等价, 这个是C语言的一个规则. 其本质是, 当编译器遇到a[n]这样的形式时, 实际上是翻译成*(a+n)进行编译的. 这种可以用一个很少见的形式来验证.你定义

int a[4]={1,2,3,4}; 然后输出

printf("%d ", 3[a]);

对, 就是把数组名放进[], 实际上会输出a[3]

‘叁’ C语言数组地址问题

解释如下:

&a,*a,a,a[0]——都表示的是数组第0行第0个元素的地址;

*a[0]——这个特殊,表示第0行第0个元素的地址的地址;

a[2],&a[2]——都表示第2行第0个元素的地址;

&a[2][2]——表示第2行第2个元素的地址;

详见图片,我已经把数组中主要元素的地址和值都打印出来了,数组中对应的每个元素的地址写出来了,对照的找下对应元素的位置,应该能理解&a,*a,a,a[0],*a[0],a[2],&a[2],&a[2][2]是什么意思了

#include<stdio.h>
#include<stdlib.h>

intmain()
{
inta[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};

printf("&a十六进制地址是%p,十进制是%d ",&a,&a);//数组名,a[3][4]
printf("*a十六进制地址是%p,十进制是%d ",*a,*a);
printf("a十六进制地址是%p,十进制是%d ",a,a);
printf("a[0]十六进制地址是%p,十进制是%d ",a[0],a[0]);
printf("*a[0]十六进制地址是%p,十进制是%d ",*a[0],*a[0]);
printf("a[2]十六进制地址是%p,十进制是%d ",a[2],a[2]);
printf("&a[2]十六进制地址是%p,十进制是%d ",&a[2],&a[2]);
printf("&a[2][2]十六进制地址是%p,十进制是%d ",&a[2][2],&a[2][2]);

printf("数组a[3][4]首元素a[0][0]的地址是%p,首元素a[0][0]的值=:%d ",&a[0][0],a[0][0]);
printf("数组a[3][4]首元素a[2][0]的地址是%p,首元素a[2][0]的值=:%d ",&a[2][0],a[2][0]);
printf("数组a[3][4]首元素a[2][2]的地址是%p,首元素a[2][2]的值=:%d ",&a[2][2],a[2][2]);
printf("一个int整型变量占的字节是:%d",sizeof(int));
return0;
}

‘肆’ c语言数组、地址问题请高手解释

定义了数组a,则机器在内存当中给数组a开辟一片内存存储数组a,数组a的元素是顺序存储的,所以说数组a所在的地址就是数组a第一个元素所在的地址,这两个指针(&a,&a[0])其实算是指向同一个地址的,所以打印出来的数值是相同的。

%p应该是64位32进制形式输出,%d是十进制形式输出的。&a[0]跟a其实是一回事,是相等的,所以第一行的第二个数,换算成十进制就跟第二行的第一个数是相等的。0x22FE30=2293296。

‘伍’ C语言 我是初学者

行地址是说一行的首地址而不是说是行指针。
行地址和列地址的概念就是从把二维数组看成是一维数组的数组,数组每一个元素都是数组
行地址就是将每一行看成一个元素,那么这个元素就可以用a[i]表示,就是第i个元素也就是第i行,
然后+j,就是,因为现在这个元素也是个数组,二a[i]表示的是一个数组的首地址,a[i]+j就是第j个元素。

至于a+i*h+j,就是讲二维数组看成从左到右,从上到下顺序排列,编译器也是这样存的数据。你要取i行j列的数据,
a//二维数组首地址
i*h//每曾一行数组元素就曾i*h个,也就是地址曾i*h,h是数组每一行的长度
j//i行的第j个

‘陆’ C语言数组和地址问题

1、字符数组c在内存中占用4个字节,值分别为8,2,0,0

2、强制转换后,整型指针p指向这个字符数组的起始位置(当前情形为值8所在的那个地址)

3、在小端格式下,p指向的整数被解释为00000208。这个16进制值(208)对应10进制值520。

这里的16进制表示只是为了便于显示,大家都知道实际上是以2进制存储的,学东西要灵活一些。你最好用调试器自己看一下,这比别人讲十遍都管用

‘柒’ C语言中的二维数组里a+1和*(a+1)为什么都是地址

二维数组又包含多个一维数组,a指向第一个一维数组的首地址就还是地址。

a+1应该是 (a+0)+1

这里的a是二维数组中的二级指针

数组名为a[0]的一维数组(表示行)

也是数组名为a的一维数组(表示列)

后面的1表示行数组移动1行

0表示列的移动

所以是1行0列的地址

*(a+1)中a是二级指针

取值二级指针是一级指针

一级指针指向的一维数组(二维数组中的行)

一维数组移动一位只能是向下移动也就是行

所以就是 第一行的首地址,也就等于二维数组中,第一行零列的地址。

(7)c语言数组行地址和列地址扩展阅读:

二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t

按“列优先顺序”存储时,地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t

存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节 [1]

‘捌’ C语言关于行地址和列地址的问题...刚才没说清楚.请高手啊...

int a[4]的a的确是a[0]元素的地址,但是他也是一个行的地址,两者并不矛盾,当int a[4],*b=a;定义是*a是a[0]的值,但是*a[4]意义就不同了,他是个指针数组,,,,,,,,,,,,,还要解释好多,实在不懂找我

‘玖’ c语言指针变量中行指针和列指针是什么要如何使用

对于一个二维数组:
int a[3][5];

a即是它的行指针,a+0表示第0行的地址,a+1表示第1行地址…
a[row]+col即列指针,列指针经过一次解引用就可以转化成二维数组中实际的值,列指针也是指向非常量的常量指针。

‘拾’ c语言中二维数组哪个是行,哪个是列

1、二维数组的第一个参数是行,第二个参数是列。二维数组定义的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2],其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。

2、C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C是高级语言:它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。C语言一共只有40个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作。

3、在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。

4、二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。

5、二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称变方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

6、二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按"行优先顺序"存储时则元素a[i][j]的地址计算为:LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t 。按"列优先顺序"存储时,地址计算为:LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t 。存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。