B和* B如何在C中返回相同的地址?

时间:2014-08-10 21:35:41

标签: c arrays pointers

我看到了这一点,现在我心里有很多疑惑:

 address  |   400   |   404   |   408   |   412   |   416   |   420   |
|---------+---------+---------+---------+---------+---------+---------|
| value   |    2    |    3    |    6    |    4    |    5    |    8    |
| ref     | B[0][0] |         |         | B[1][0] |         | B[1][2] |
| ref     |         |  B[0]   |         |         |  B[1]   |         |

int B[2][3];

// B[0] and B[1] are one dimensional arrays of 3 integers

int (*P)[3] = B;
Print B;         \\ -> 400
Print &B[0];     \\ -> 400
Print *B;        \\ -> 400
Print B[0];      \\ -> 400
Print &B[0][0];  \\ -> 400
Print B + 1;     \\ -> 412
Print &B[1];     \\ -> 412
Print *(B+1);    \\ -> 412
Print B[1];      \\ -> 412
Print &B[1][0];  \\ -> 412
Print *(B+1)+2;  \\ -> 420
Print B[1]+2;    \\ -> 420
Print &B[1][2];  \\ -> 420

问)B和* B如何才能返回地址? 我们可以增加数组地址B + 1吗?这不对吗?

Q)*(B + 1)或B [1]或& B [1] [0]等于412?  我以为会是4.

2 个答案:

答案 0 :(得分:4)

  

B和* B如何才能返回地址

数组的第一个元素从与数组本身相同的地址开始。 (换句话说,没有初始填充)。因此,&B&B[0]&B[0][0]都表示相同的地址,但它们的类型不同。

数组到指针衰减后,B表示&B[0]*B表示&B[0][0]

  

& B [1] [0]等于412?我以为会是4.

在这个假设的例子中,地址从400开始。内存位置的地址与存储在该位置的值(4)不同。

  

我们可以递增数组地址B + 1

在C中,增量通常表示++运算符。你不能写B++。但你可以做B+1。由于B是一个数组,它会衰减为指针&B[0],并且可以向指针添加整数。

也许你忽视了数组语法的含义;一般来说,*(p+N)p[N]相同。

*p*(p+0)不同的极端情况,但这些情况不会影响此示例; *B表示与B[0]相同。

答案 1 :(得分:2)

1)

  

B和* B如何才能返回地址?我们可以增加数组   地址B + 1不是这个错误的

阵列在每次机会时都会衰减成指向第一个元素的指针,因此当您打印B时,它会变为&B[0]或B的第一个元素的地址(不是*B你说,这是第一个元素的值。)

2)

  

*(B + 1)或B [1]或& B [1] [0]等于412?我想到了   将是4。

B可以为此目的考虑为int数组的数组。记住,因为数组在每次机会时衰减为指针,因此*(B+1)是B中第二个([1])“数组”的第一个元素(第0个元素)的值。等价,B [1]是一样的。 *B[1][0]是前两者的混合物。同样,所有这些都是数组中[1] [0]的值,它是一个整数数组,而不是字符数组。这个位置的整数显然是412.如果这是char**而元素是“412”,那么你说第一个元素是'4'就是对的。