使用C中的指针传递和更改数组,通过引用传递

时间:2015-02-26 01:24:46

标签: c arrays pointers

我正在为一个大学项目工作,我已经被困在这一部分上一段时间,但似乎无法找到答案。基本上我们必须创建一个程序,使用传递引用来填充数组,而不使用下标(只是令人讨厌,因为他认为他们执行得更快)。 这是我到目前为止所得到的:
这些是主要的相关部分:

#define SIZE 4

int *enteredCode;
enteredCode = (int*)calloc(SIZE, sizeof(int));
codeEnter(&enteredCode);

这是一个头文件:

//codeEnter function
void codeEnter(int **code){
//Declarations

system("cls");
puts("************* INPUT CODE *************"
    "\n\nPlease enter your 4 digit code:");
for (int i = 0; i < SIZE; i++){
    scanf("%d", *(code + i));
}//End of for

如果我将其更改为:

,我可以将其工作
#define SIZE 4

int enteredCode[SIZE];
codeEnter(enteredCode);

标题部分:

void codeEnter(int *code){
//Declarations

system("cls");
puts("************* INPUT CODE *************"
    "\n\nPlease enter your 4 digit code:");
for (int i = 0; i < SIZE; i++){
    scanf_s("%d", &*(code + i));
}//End of for

}//End of codeEnter

任何帮助和解释将不胜感激。

2 个答案:

答案 0 :(得分:0)

主要问题是如何取消引用codeEnter函数中的数组。

您正在传递一个指向int数组的指针,您需要获取该数组第i个元素的地址。

所以

void codeEnter(int **code) {
  int* array = *code; // <- you obtain the original array
  int* element = (array+i); // <- you obtain the address of the element
  ...
}

这个组合变为*code + i,而不是*(code+i)。在你的代码片段中,你基本上修改了包含数组地址的地址(所以你获得了一个垃圾地址)。

答案 1 :(得分:0)

suggest something like this:

#define SIZE 4

int *enteredCode:
if( NULL == (enteredCode = calloc(SIZE, sizeof(int)) ) )
{ // then calloc failed
    perror( "calloc failed" );
    exit( EXIT_FAILURE );
}

// implied else, calloc successful

codeEnter(enteredCode);

---

And this is in a header file:

//codeEnter function declaration
void codeEnter(int *code);

// this in the source file:

void codeEnter(int *code)
{  
     system("cls");
     puts("************* INPUT CODE *************"
          "\n\nPlease enter your 4 digit code:");

    for (int i = 0; i < SIZE; i++)
    {
        if( 1 != scanf("%d", (code + i)) )
        { // then, scanf failed
            perror( "scanf failed" );
            free(code);
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful

    }//End for

    // rest of function here

} // end function: enterCode