我看到了这一点,现在我心里有很多疑惑:
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.
答案 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'就是对的。