English 中文(简体)
指针、多维阵列和地址
原标题:Pointers , Multidimensional arrays and Addresses
  • 时间:2012-05-24 23:20:34
  •  标签:
  • c

Lets say we have : int A [5] [2] [3]; Now, if I do : A[1][0][0] = 4; does that mean :

1. A[1]和A[1][0]是指点?

2. 如果A[1]是一个指针,那么它将存储指针A[1][0]的地址?

3. 如果A[1][0]是一个指针,那么它将保存A[1][0][0]的地址,这不是指针,而只是一个存储4值的变量?

如果上述点是正确的,那么为什么以下代码给我们的整数地址相同:

int main(void)
{
        int A [5] [2] [3];
    A[1][0][0]=4;

    printf("%d

", A[1]);
    printf("%d

", A[1][0]);
    printf("%d

",&A[1][0][0]);

        system("pause");
}

在这里,我假设A[1]是一个指针指向另一个指针A[1][0],从而储存指针A[1][0]的地址。A[1][0]是一个指针指针指向VA[1][0][0],因此储存VA[1][0][0]的地址。

帮帮我!

最佳回答

为了正确回答你的问题,按行排列顺序阅读,这就是如何将多维阵列储存在C中。Wikipedia article 的文章有一点点太长,但其中之一可能更清楚:

http://webster.cs.ucr.edu/AoA/Windows/HTML/Arraysa2.html http://archive.gamedev.net/archive/reference/articles/article1697.html http://www.ibiblio.org/pub/languages/fortran/append-c.html

s 这个SO问题 也存在。


直接回答你的观点,假设你知道行-行-主储存是如何工作的:

int A[5][2][2][3] 宣布一个毗连的内存区域为5*2*3英寸长:五个阵列,每个阵列由三英寸组成的两个阵列组成。这些阵列以线性内存形式相互储存,以便

&A[0][0][0] == A
&A[0][0][1] == A+1
&A[0][1][0] == A+(1*3)
&A[3][1][2] == A+(3*(2*3))+(1*3)+2

A[1] 在技术上不是一个指针,而是一个阵列。它是一个 int [2][3] 阵列。但我发现,要考虑 A[5][2][3] 远比考虑 A[5][2][3] 要清楚得多,因为这是一个平坦的内存区,长30英寸。

A[0][0][0] is the first integer in that region. 
A[0][0][1] is the second integer. 
A[0][0][2] is the third integer. 
A[0][1][0] is the fourth integer in this flat region. 
A[0][1][1] is the fifth integer. 
And so on until A[1][0][0] is the eleventh integer. 

因此, A[1][0][0][0] 的地址是过去 A[0][0][0] 的10个整数; , 。由于C语言对于数组和指针之间的差异非常松散,因此, A[1] 被解释为您在表达中使用它时是一个地址,尽管它确实意指“由3个整数组组成的5个阵列组成的两个阵列中的第一个元素”,而“3个整数组组成的两个阵列”。

上图显示, A[1] store a 指针,它 is a 指针。从 在多维数组中存储一个整数。

在(2)点和(3)点中,你所想到的是数组指针 ,它们不同。

这比用图片解释容易得多, 这就是为什么你应该找到一本关于C阵列的适当的教科书或文章。

一般来说,在学习C中的指针和阵列时,我建议你暂时忘记语言本身,并假装你是Dennis Ritchie 在PDP-11电脑上发明C, 带有56kb 平坦的 RAM 。 获得一张大图纸, 连续编号它的单元格, 假装它代表你的 RAM 和每个单元格是一个字节, 并且 < a href=" https://stackoverflow.com/ questions/706283/c-pointer-straction/7062888# 7062888" 您可以用铅笔和纸 来通过你的指针数学工作 。

C是在这种环境中发明的,理解其起源将使现代的建筑更加合理。

作为侧边的注意,当我试图写下这个答案时, Stack Overflows 标记语言反复改变,并破坏了我上面的数组示例中的索引。所以如果你看到任何数字在它们的数组中似乎超出范围, 编辑就引入了错误 。

问题回答

如果您有动态数组(即分配到 malloc /callaoc )的动态数组(即分配到 malloc )。

然而,静态阵列被分配为内存的毗连块,只是第一个元素的指针。当您写入 A[X][Y][Z] 时,它基本上相当于 ,而不是。这样可以更快地访问数据(您不需要访问中间指针),但要求所有数据都分到一个块,并具有常规大小。

这里 更多关于C中静态与动态阵列不可互换的信息。

变数A是5 * 2 * 3 英寸,作为块(即30 英寸)一起分配。

`int A[5][2][3]宣言没有涉及指针; - 唯一留出的空间是持有30元值。

当您使用 A 和 下标书写一个表达式时, 因为您已经说过有 3 个维度, 您必须提供全部 3 个 来指定您正在访问或更改的直观值 。 如果您使用小于 3 个下标, 您只能部分指定您正在访问的内容 ; 公约是, 此引用被作为整个空间相关部分的地址请求 。

虽然指针对指针对指针的访问看似相似,但实际数据可能并不毗连,而且存在存储所有地址的间接费用。

char a[5][7][9]
a[d][h][w]  <<==>>  ((char*)a)[((9*7*d)+(9*h)+w] 

C数组全部共享它们衰变(或自动转换为指向数组中第一个元素)的属性。因此,

a[1]  (char[7][9])    --decay-->   ((*char)[5][9]) pointer to char array
&a[1] ((*char)[5][9])  no decay

两者等同,因为后来你明确“去掉”指针,而第一个指针自动发生。

http://en.wikipedia.org/wiki/Row-major_order" rel="nofollow" >Row Major order

是啊,这没有帮助, 我在想C是 专栏主修的一秒钟 我认为那里。 (忘了所有的东西意味着什么)

可能有点奇怪,但我的解释是这样的。想象一下,你有六个不同的人,从1人到6人,他们从1人排到6人,他们从1人到6人。如果你告诉大家,这支队伍(6人)分为两组,前三组(1-3)在A组,其余(4-6)在B组。

[1、2 3] [4 5 6]

那么,如果我告诉你谁是第一组,你会说第一组。如果我问你谁是第一组,谁是第一组?这是同一个,是第一个!

还有,如果我告诉你谁是团队第四名成员?你会说第四名成员!然后,如果我问你谁是团队B组的第一个成员呢?这是相同的,第四组。


同一故事发生在您身上; A[ 1 是一个指针, 指向大阵列( 团队) 的“ 强” 开始 < 强 > / 强 >, A[ 1][ 0] 告诉 A[ 1][ 0] 指向大阵列( A[ 1) 内第一阵列( 第一阵列) 的 " 强 " 开始 < 强 " / 强 " ( 第一组) 的 " 强 " (A[ 1] ), 相同! 然后你说, & amp; A[ 1][ 0][ 0], 这就像要询问大阵列中第一个 " 强 " 内阵列 " /强 " 的 " 强 " 成员 < /强 ", 你的数目是什么? 然后, 他将重弹同样的 。

不同之处在于指针的 < 坚固 > 类型 < / 坚固 > 及其解释方式,但其 " 坚固 > 值是相同的 < /坚固 > 。这是因为阵列以毗连的方式存储元素。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...