在C中传递数组指针

dev*_*vin 7 c arrays pointers

所以我有一些看起来像这样的代码:

int a[10];
a = arrayGen(a,9);
Run Code Online (Sandbox Code Playgroud)

并且arrayGen函数如下所示:

int* arrayGen(int arrAddr[], int maxNum)
{
    int counter=0;
    while(arrAddr[counter] != '\0') {
        arrAddr[counter] = gen(maxNum);
        counter++;
    }
    return arrAddr;
}
Run Code Online (Sandbox Code Playgroud)

现在compilier告诉我"警告:传递'arrayGen'的参数1从指针生成整数而没有强制转换"

我的想法是我传递'a',一个指向[0]的指针,然后由于数组已经创建,我可以只填写[n]的值,直到我a [n] =='\ 0'.我认为我的错误是arrayGen被写入接收数组,而不是指向一个数组.如果这是真的我不知道如何继续,我会写地址值,直到一个地址的内容是'\ 0'?

Cha*_*tin 17

这里的基本魔法是C中的这个身份:

*(a+i) == a[i]
Run Code Online (Sandbox Code Playgroud)

好的,现在我会把它变成可读的英文.

这是问题:数组名称不是左值; 它不能分配给.所以你有这条线

a = arrayGen(...)
Run Code Online (Sandbox Code Playgroud)

是问题.看这个例子:

int main() {
    int a[10];

    a = arrayGen(a,9);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了编译错误:

gcc -o foo foo.c
foo.c: In function 'main':
foo.c:21: error: incompatible types in assignment

Compilation exited abnormally with code 1 at Sun Feb  1 20:05:37
Run Code Online (Sandbox Code Playgroud)

你需要有一个指针,它一个左值,分配结果.

这段代码,例如:

int main() {
    int a[10];
    int * ip;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译好:

gcc -o foo foo.c

Compilation finished at Sun Feb  1 20:09:28
Run Code Online (Sandbox Code Playgroud)

请注意,由于顶部的标识,您可以将ip视为数组,如下所示:

int main() {
    int a[10];
    int * ip;
    int ix ;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    for(ix=0; ix < 9; ix++)
        ip[ix] = 42 ;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

完整的示例代码

为了完整起见,这是我的完整例子:

int gen(int max){
    return 42;
}

int* arrayGen(int arrAddr[], int maxNum)
{
    int counter=0;
    while(arrAddr[counter] != '\0') {
        arrAddr[counter] = gen(maxNum);
        counter++;
    }
    return arrAddr;
}

int main() {
    int a[10];
    int * ip;
    int ix ;

    /* a = arrayGen(a,9);  */
    ip = a ; /* or &a[0] */
    ip = arrayGen(ip,9);

    for(ix=0; ix < 9; ix++)
        ip[ix] = 42 ;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 你的描述很好 - 除了左值的东西.数组是左值.但它不是一个可修改的左值:数组和常量属于这个区域:const int b = 10; //也是不可修改的左值.C中左值的重要特征是有一个对象 - 而不仅仅是一个值. (3认同)