void main()
{
int array[10] = {1,2,3,4,5,6,7};
printf("%p\n",array);
}
Run Code Online (Sandbox Code Playgroud)
这里,系统将在堆栈中分配相当于10个整数的内存.但是,我不认为为变量数组分配任何额外的内存,我认为这array是人类理解和编码目的的助记符.如果是这种情况,那么printf()语句中的内容如何- printf("%p\n",array);接受它就好像它是一个指针变量?
随着阵列的尺寸不断增加,这种混淆变得更加明显.
int main()
{
int matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
printf("%p\n", matrix);
printf("%p\n", matrix+1);
printf("%p\n", *(matrix+1));
}
Run Code Online (Sandbox Code Playgroud)
其中一个程序执行的输出是 -
0x7ffd9ba44d10
0x7ffd9ba44d20
0x7ffd9ba44d20
Run Code Online (Sandbox Code Playgroud)
这样既matrix+1和*(matrix+1),间接输出后相同的虚拟内存地址.我理解为什么matrix+1地址是它显示的内容,但我不明白为什么*(matrix+1)即使在间接后也输出相同的地址!
井数组不是指针.大多数情况(例外sizeof,&运算符_alignof等) - 它被转换为(数组衰减)指向第一个元素的指针.
所以这里matrix被转换(衰减)成指向第一个元素的指针 - int (*)[4]当传递给它时printf.
现在逐个剖析,matrix+1将指向2d数组的第二个元素,它是2d数组的第二个元素(这就是为什么它们sizeof(int)*4相隔一段时间.
在第三种情况下它们是相同的,因为matrix+1它是类型的int (*)[4],当你取消引用它时,你得到的int[4]基本上与之前的地址相同.
有一点要记住 - 指针有两件事
两个指针可能具有相同的值,但它们的类型可能不同.你也看到了这一点.
它(腐朽)在标准6.3.2.1p3中提到: -
除非它是运算
sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型'array of type'的表达式转换为具有'pointer to type'指向数组的初始元素的类型的表达式对象并不是左值.
您也以错误的方式打印地址(这是您使用铸造的情况之一).
printf("%p",(void*)matrix);
Run Code Online (Sandbox Code Playgroud)
为了使事情更清楚: -
matrix基本上是一个int[2][4]在你所展示的情况下腐烂的物体int(*)[4].你可能想知道是什么让它matrix+1
指向数组的第二个元素 - 事物是指针算术由它所指向的东西来指示.这里matrix作为衰减到第一个元素(int(*)[4])的指针,它将移动4 ints 的大小.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |