在C中循环指针数组?

在C中循环指针数组?,c,arrays,pointers,C,Arrays,Pointers,我有一个指针数组,我想将所有值设置为0 这是我的密码: #define EMPTY 0 void initBoard(int *ptr, int n){ n = n * n; ptr = (int*)malloc(n*sizeof(int)); int i = 0; for(i;i<n;i++){ *ptr = EMPTY; *ptr++; } i = 0; for(i;i<n;i++){ printf("%d\n",*ptr); *ptr++;

我有一个指针数组,我想将所有值设置为
0

这是我的密码:

#define EMPTY 0

void initBoard(int *ptr, int n){

n = n * n;
ptr = (int*)malloc(n*sizeof(int));
int i = 0;
for(i;i<n;i++){
    *ptr = EMPTY;
    *ptr++;
}
i = 0;
for(i;i<n;i++){
    printf("%d\n",*ptr);
    *ptr++;
}

}
相反,我得到的是:

394066110
7321
6890384
6881472
为什么我会得到这个

编辑:

将打印:

0 - 4 - 8
12 - 16 - 20
24 - 28 - 32
下面是我调用函数时的外观:

    int *ptr, win = 0;

initBoard(*ptr);
printBoard(*ptr);
编辑2:

#include <stdio.h>
#include <stdlib.h>

//define
#define EMPTY 0
#define CROSS 1
#define CIRCLE 2
#define NO_WIN 0
#define PLAYER_WIN 1
#define COMPUTER_WIN 2
#define DRAW 3

//funktioner
void printBoard(int *ptr);
int checkWin(int *ptr);
void computerMove(int *ptr);
void initBoard(int *ptr);

int main()
{
    int *ptr, win = 0;

    initBoard(*ptr);
    printBoard(*ptr);

    return 0;
}

void printBoard(int *ptr){

    printf("%d - %d - %d\n", ptr[0], ptr[1], ptr[2]);


}

int checkWin(int *ptr){

    return 0;

}

void computerMove(int *ptr){

}

void initBoard(int *ptr){

    ptr = malloc(9*sizeof(int));
    int i = 0;
    //int *orig = ptr; //spara pointern
    for(i;i<9;i++){
        *ptr = EMPTY;
        ptr++;
    }
}
#包括
#包括
//定义
#定义空0
#定义交叉点1
#定义圆2
#定义无赢0
#定义玩家赢1
#定义计算机2
#定义图3
//滑稽演员
无效打印板(int*ptr);
int checkWin(int*ptr);
无效计算机移动(int*ptr);
无效初始板(int*ptr);
int main()
{
int*ptr,win=0;
初始板(*ptr);
印刷板(*ptr);
返回0;
}
无效打印板(int*ptr){
printf(“%d-%d-%d\n”,ptr[0],ptr[1],ptr[2]);
}
int checkWin(int*ptr){
返回0;
}
无效计算机移动(int*ptr){
}
无效初始板(int*ptr){
ptr=malloc(9*sizeof(int));
int i=0;
//int*orig=ptr;//spara pointern

对于(i;i您误解了解引用运算符
*
和增量后运算符
++
的交互方式

编写此
*ptr++
时,您会说“首先,获取指针处的可写值;然后递增指针”。此表达式本身没有意义,因为取消引用的结果被丢弃。换句话说,它相当于
ptr++

现在考虑你的第二个循环。你的指针指向分配块的末尾的一个。在这一点上,取消它是非法的。< /P> 您可以通过在进入第一个循环之前存储原始指针,并在第二个循环之前使用保存的值重置

ptr
来解决此问题:

int i = 0;
int *orig = ptr; // Save the original pointer
for(i;i<n;i++){
    *ptr++ = EMPTY; // Combine ++ and * on assignment
}
i = 0;
ptr = orig; // Restore the original pointer
for(i;i<n;i++){
    printf("%d\n", *ptr++); // Combine ++ and * on read
}
调用
initBoard(&ptr,n)
,并使用
ptrPtr
进行额外级别的取消引用,即

*ptrPtr = malloc(n*sizeof(int));

将此更改为
void initBoard(int*&ptr,int n){
,否则您正在写入参数的副本。您忘记在第二个循环开始之前重置
ptr
。因为您没有保存副本,所以您不能,也不能
free(ptr)
也可以。所以保留一份
ptr
的副本。使用
ptr[i]
不是更简单吗?这样整个代码就很容易理解并且没有皱褶。@πάνταῥεῖ 这是标记为C的。OP需要
int**ptr
。另一种在分配内存时将所有值设置为
0
的方法是使用
calloc
。嘿,在这段代码之后,如果我尝试“printf”(%d-%d-%d\n),ptr++,ptr++,ptr++)我得到这个'0-4-8',为什么我得不到'0-0-0'?我仍然得到相同的answe使用ptr+1。请看我的问题,我将在我的新code@MosOm我明白了,缺少星号:
printf(“%d-%d-%d\n”、*(ptr+0)、*(ptr+1)、*(ptr+2))
@MosOm更好,
printf(“%d-%d-%d\n”、ptr[0]、ptr[1]、ptr[2])
int i = 0;
int *orig = ptr; // Save the original pointer
for(i;i<n;i++){
    *ptr++ = EMPTY; // Combine ++ and * on assignment
}
i = 0;
ptr = orig; // Restore the original pointer
for(i;i<n;i++){
    printf("%d\n", *ptr++); // Combine ++ and * on read
}
void initBoard(int **ptrPtr, int n);
*ptrPtr = malloc(n*sizeof(int));