在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));