微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中使用数组的指针问题

如何解决在 C 中使用数组的指针问题

在 C 中使用指针和数组我发现了一个奇怪的案例,我不明白为什么会发生这种情况。

首先,我想描述正确的情况: 我定义了一个函数 void modifyArray(int *list),其中必须通过引用修改数组以将项目乘以 2 倍 (x2)。函数实现为:

void modifyArray(int *list,int arrLength){
    for(int i=0; i<arrLength; i++){
        *(list + i) = *(list + i) * 2; // x = x * 2
    }
}

int main(int nargs,char **args) {

    int list[] = {1,2,3,4,5};
    modifyArray(&list,5);

    for(int i=0; i<5; i++){
        printf("%d\n",*(list + i));

    }
}

输出为:

2
4
6
8
10

现在我要解释不正确的情况:我定义了一个新的数据类型 List修改函数以接受 List 而不是 {{1 }} 或 int * 作为第一个参数:

int[]

修改后,我的编译器构建失败,因为语句 typedef int List[5]; void modifyArray(List *list,int arrLength){ for(int i=0; i<arrLength; i++){ *(list + i) = *(list + i) * 2; // x = x * 2 } } 无法乘以以下错误消息:

二进制表达式的无效操作数('List'(又名'int [5]')和'int')

我知道我的编译器试图将整个数组乘以 2,但不知道原因。

我找到的解决方案是将 *(list + i) = *(list + i) * 2; // x = x * 2 替换为 *(list + 1)。我很困惑,因为在第二种情况下,当我打印 *(*list + 1)list 时,输出是内存地址(两者的内存地址相同)而不是 *list 及其内容的内存地址list

你能解释为什么会发生这种情况吗?使用 *listint * 定义的类型有什么区别?

解决方法

listint list[] = {1,2,3,4,5}; 一起定义时,&list 是一个指向五个 int 数组的指针。将它传递给 int * 类型的参数是不合适的,编译器应该在第一个代码中发出警告或错误。正确的参数是 list。虽然它是一个数组,但它会自动转换为指向其第一个元素的指针,并且该指针是一个 int *,这是参数的正确类型。

当参数声明为 List *list 时,它是一个指向数组的指针。然后,在 *(list + i) 中,加法是以这些数组为单位完成的,而不是以 int 为单位。加法的结果是一个数组的指针,所以*中的*(list + i) 的结果是一个数组。然后乘法试图将一个数组乘以 2,所以编译器会抱怨。

相反,将参数声明为 List list。这将它声明为一个数组,但它会自动调整为指向 int 的指针。由于 C 不支持将数组作为参数传递,因此它会自动将参数作为数组的声明调整为指向数组元素的指针的声明,这是支持的。

另外,不要写*(list + i)。使用list[i]。这意味着同样的事情,但更容易阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。