【发布时间】:2022-01-22 01:24:30
【问题描述】:
我有以下两个代码 sn-ps 将一个数组复制到另一个数组中,用 C 编写的 VS 代码:
片段 1 ~
int arr[5]={1,2,3,4,5};
int arr_copy[5];
int *ptr = arr;
for(int i=0; i<5;i++)
{
arr_copy[i]=*ptr[i];
}
片段2~
int arr[5]={1,2,3,4,5};
int arr_copy[5];
int *ptr=arr;
for(int i=0; i<5;i++)
{
arr_copy[i]=ptr[i];
}
第一个 sn-p 在编译时抛出一个错误,说 *ptr[i] 无效,但第二个 sn-p 有效。第一个不应该返回存储在指针 ptr[i] 的值,而第二个应该返回 ptr[i] 的整数地址吗?只是 C 语法的编写方式还是背后有一些逻辑?
【问题讨论】:
-
因为
*ptr[i]与*(ptr[i])相同。事实上,由于对于任何指针或数组ptr和索引i,表达式ptr[i]完全 等于*(ptr + i),因此解引用内置于数组索引中。所以*ptr[i]将是*(*(ptr + i)),这是一个取消引用太多了。