C程序为什么价值" a"也改变了

时间:2015-01-08 09:01:21

标签: c

#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也应该保持不变

3 个答案:

答案 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