代码之家  ›  专栏  ›  技术社区  ›  Leonardo

了解objective-c/c中的数组

  •  1
  • Leonardo  · 技术社区  · 16 年前

    我刚迈出第一步 Objective-C . 我有一个关于数组如何工作的非常简单的问题。

    我有两个.m文件:

    1)

    Line = origin[6];
    forloop(i...i++) {
        origin[i]=7;
    }
    [buildSubview:origin];
    

    2)

    Line response[6]; 
    
    -(id)buildSubview:(Line[])origin {
        *response=*origin;
        NSLog(@"response[1]=%o",response[1]);
        NSLog(@"origin[1]=%o",origin[1]);
        ........
        .....
    }
    

    我得到的结果是:

    response[1]=0; <-- I would expect the same value as origin
    origin[1]=7;
    

    但如果我要求打印索引0处的值,我会得到我所期望的:

    response[0]=7; <-- Now they are the same
    origin[0]=7;
    

    我在问为什么两种不同的价值观?还有,如果我写

    response=origin;
    

    我得到一个不兼容的赋值编译错误?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    简要地, sometimes ,C中数组的名称“衰减”为指向数组第一个元素的指针,这会给您带来麻烦。

    当你写作时

    response=origin;
    

    名字 origin 论rhs“衰变”的类型 Line * ,并指向 起源 数组,而 response 属于“行的数组[6]类型”。由于这两种类型不兼容(用指针初始化数组没有意义),这是一个错误。

    现在,

    *response=*origin;
    

    不会把所有的记忆都复制进去 起源 响应 . 正如我上面提到的,在上面的链接中更详细地说, 起源 指向 起源 数组在这个上下文中,所以 *origin 实际上是数组的第一个元素。因此, *response=*origin; 只复制 起源 数组到的第一个元素 响应 . 因为你没有给 response[1] ,它包含垃圾。

    如果要复制阵列数据,可以执行循环:

    size_t i;
    for (i=0; i < 6; ++i)
        response[i] = origin[i];
    

    或者,你可以使用 memcpy() :

    memcpy(response, origin, sizeof response);
    

    (以上是针对c的,objective-c可能有差异,也可能有其他方式做你想做的事情。)