#include <stdio.h>
int main( int argc, char *argv[] )
{
int a[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int *b = a[1];
b[2] = 99;
for ( int i = 0; i < 3; i++ )
{
printf( "%d,", a[1][i] );
}
}
输出:4,5,99,
#include <stdio.h>
int main( int argc, char *argv[] )
{
int a[3] = { 1, 2, 3 };
int b = a[1];
b = 99;
for ( int i = 0; i < 3; i++ )
{
printf( "%d,", a[i] );
}
}
输出:1,2,3
为什么我得到了如此不同的结果? 我认为在第一部分a也应该保持不变
答案 0 :(得分:4)
执行int *b = a[1]
时,b
指向与<{1}}相同的相同内存位置,即a[1]
。因此,当您更新int[3]
时,b[2]
也会更新。
在第二种情况下,a[1][2]
将int b = a[1]
设置为与b
相同的值,但是在不同的内存位置,所以{{1} }}已更新,a[1]
不是。
我会更多地了解指针在C中的工作原理。
答案 1 :(得分:1)
int *b
b是指向2D数组第二行的指针,它具有行a[1]
的内存位置,它可以通过解除引用来更改内存位置的内容。
b[2] = *(b+2) = 99;
尽管
int b;
b不是指针。您不能引用变量,如指针,以存储特定内存位置的值。因此,当您执行
时,您会看到该值未更改b = 99;
在第二个代码段中
答案 2 :(得分:1)
注意:这里假设int为2个字节。
案例1 : int a [3] [3] = {{1,2,3},{4,5,6},{7,8,9}};
将按如下方式分配:
a[0]:
a[0][0] a[0][1] a[0][2]
+----+----+----+
| 1 | 2 | 3 |
+----+----+----+
1000 1002 1004
a[1]:
a[1][0] a[1][1] a[1][2]
+----+----+----+
| 4 | 5 | 6 |
+----+----+----+
1006 1008 1010
a[2]:
a[2][0] a[2][1] a[2][2]
+----+----+----+
| 7 | 8 | 9 |
+----+----+----+
1012 1014 1016
int *b = a[1];
b
+----+
|1006| // 1006 is the address of the a[1]
+----+
11000
b[2] = 99;
b [2]是第二个数组中具有地址位置1010的第三个元素。
因为b是指向第二个(即a [1])数组的指针,因此b [2]只是*(b + 2),它与第一个元素的偏移量因此是[ 1] [2]将被捕获。
b
+----+
|1006| // 1006+2 will be the location that is 1010 (as int takes 2 bytes). Here
+----+ // address location are taken for just reference purpose.
11000
a[1]:
a[1][0] a[1][1] a[1][2]
+----+----+----+
| 4 | 5 | 22 |
+----+----+----+
1006 1008 1010
printf( "%d,", a[1][i] );
Outputs: 4,5,99
案例2 :
int a[3] = { 1, 2, 3 };
a[3]:
a[0] a[1] a[2]
+----+----+----+
| 1 | 2 | 3 |
+----+----+----+
1000 1002 1004
int b = a[1];
b
+----+
| 2 |
+----+
5000
b = 99;
b的值被覆盖。
b
+----+
| 99 | // Since b is a normal variable and hence will not affect array memory location.
+----+
5000
printf( "%d,", a[i] );
正如您所见,数组不会受到影响。
Output: 1,2,3