c++ - 数组元素值、元素地址和指针增量

标签 c++ arrays pointers multidimensional-array memory-address

<分区>

这是一个非常基本的概念。但是,我通常会感到困惑。帮助我。

案例一:

对于下面的代码:

int oneDArray[] = {1,2,3};
cout<<&oneDArray<<endl;
cout<<oneDArray<<endl;
cout<<&oneDArray+1<<endl;
cout<<oneDArray+1<<endl;

输出是:

0x28fef4
0x28fef4
0x28ff00
0x28fef8

为什么增量值有差异?

案例二:

  int arr[2][3] = {{1,2,3}, {4,5,6}};
  cout<<&arr<<endl;
  cout<<arr<<endl;
  cout<<*arr<<endl;

  cout<<&arr+1<<endl;
  cout<<arr+1<<endl;
  cout<<*arr+1<<endl;

输出是:

0x28fee8
0x28fee8
0x28fee8
0x28ff00
0x28fef4
0x28feec

为什么 arr & *arr 的输出相同? (内部运作方式) 为什么增量值会有差异?

最佳答案

对于你的一维数组:

//starting at memory address: 0x28FEF4
int My_Array[3] = {1,2,3};

//memory dumping, each 'int' element takes 4 bytes, 
//high bytes are at higher addresses
0x28FEF4 01 00 00 00
0x28FEF8 02 00 00 00
0x28FEFC 03 00 00 00

这是从C语言到英文的翻译:

My_Array     = (address) of-the (first-byte) of (My_Array)
My_Array[0]  = (value)   of-the (element-at-index-0)
My_Array[k]  = (value)   of-the (element-at-index-k)

&My_Array    = (address) of-the (first-byte) of (My_Array)
&My_Array[0] = (address) of-the (first-byte) of (element-at-index-0)
&My_Array[k] = (address) of-the (first-byte) of (element-at-index-k)

*My_Array    = (value) pointed-by (My_Array)
*My_Array[0] = (value) pointed-by (My_Array[0])
*My_Array[k] = (value) pointed-by (My_Array[k])

The values of 'My_Array' and '&My_Array' are always identical for array type
but there's a difference when using them with mathematical operators.
My_Array is a pointer to 'int' type, while &My_Array is a pointer 
to 'int[3]' type.  When incremented, the values added in are sizeof(int) 
and sizeof(int[3]) respectively.

The last two notations: *My_Array[0] and *My_Array[k]
are valid in mathematical sense but not valid in C language when using 
with single-dimension array because C langugae doesn't allow using 
'int' value as pointer.

你的case 1输出结果说明:

(&My_Array) is identical to (My_Array)  = 
0x28FEF4

(My_Array)  is identical to (&My_Array) = 
0x28FEF4

(&My_Array+1) = 0x28FEF4 + sizeof(int[3]) = 0x28FEF4 + 12 = 
0x28FF00

(My_Array+1)  = 0x28FEF4 + sizeof(int)    = 0x28FEF4 + 4  = 
0x28FEF8

将我上面的笔记应用到你的第二个案例中,注意这些:

(1) Value of element in single dimension array is the base type. Eg:
    int My_Array[3]; //base type is 'int'

(2) Value of element in multiple dimension array is either pointer 
    or base type. Eg:
    int My_Array[2][3][4]; //base type is 'int'

    My_Array is a pointer to 'int' type        
    My_Array[i] is a pointer to 'int' type
    My_Array[i][j] is a pointer to 'int' type
    My_Array[i][j][k] is an 'int' value

    &My_Array is a pointer to 'int[2][3][4]'
    &My_Array[i] is a pointer to 'int[3][4]' 
    &My_Array[i][j] is a pointer to 'int[4]'
    &My_Array[i][j][k] is a pointer to 'int'

(3) Values of 'My_Array' and '&My_Array' are always equal,
    however, when dealing with operators, they work differently.
    Eg.
    int My_Array[2][3][4]; //base type is 'int'

    '&My_Array' here is a pointer to 'int[2][3][4]', but
    'My_Array' is a pointer to base type 'int'.

(4) A pointer is always incremented by the size of the type 
    that it points to. 'int' has size of 4 bytes.
    Eg.
    int My_Array[2];          //type size = (2)*4
    int My_Array[2][3];       //type size = (2*3)*4
    int My_Array[2][3][4];    //type size = (2*3*4)*4
    int My_Array[2][3][4][5]; //type size = (2*3*4*5)*4

关于c++ - 数组元素值、元素地址和指针增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13189996/

相关文章:

c++ - bitsets 是如何工作的

c++ - Allegro 5、C++ 和数学

javascript - 连接数组值

c - C中指针的类型转换

c++ - 使用无符号 "negative"数字递减指针

c++ - 在 std vector 中存储对象的正确方法

Javascript - 当对象是对象数组时获取对象的键

arrays - 有没有一种方法可以循环整数数组,跟踪所有唯一元素而不分配新数组?

c++ - 如何显示常量字符指针的地址

c - C 中 malloc 的惯用宏?