我正在尝试做一些指针算术,并且由于某种原因,指针在退出循环后并未保留地址中的更改。指针算术不起作用
我的输出是反复打印不变的数组指针地址(整数数组)。
它应该是打印一个值的地址,然后在骰子滚动后将指针向前移动数组中的许多位置,然后在下一次打印。
编辑:我不写一个链表。我试图做的一个确切的例子可以在这里找到:TutorialsPoint.com | C - Pointer arithmetic10然而,虽然我可以运行该示例代码,并使其工作完美,我的代码每次都失败。
编辑2:完整的源代码被要求
ProjectName.cpp
#include "TableOfContents.h"
void main()
{
FILE *fp; //file reader
char board[100] = " mHk nH l B He Flq p H hByHlho H B jr HFB ir j H F ku gd H pjB mH x BF i H m oB HlHFBhoH BB ";
char *p1, *p2; // player 1 and player 2
int turn = 1;
srand(time(NULL)); // should only be called once
// int z[10]; // example of how to make an array
/*
fp = fopen("C:\\Users\\ritol\\Documents\\cities1.txt", "r");
inputLine = "";
inputP = &inputLine; // set inputP to the address for inputLine
*/
p1 = &board[0];
p2 = &board[0];
fp = fopen("C:\\Users\\ritol\\Documents\\outputGameBoard.txt", "w");
while (turn <= 45) //
{
//output the current turn
//call the function move for p1
move(*p1, *p2, turn, board);
turn++;//TODO: only put this in it's correct place
//call the function move for p2
move(*p1, *p2, turn, board);
//increment turn
turn++;
//call output function to output current board to disk file
output(board, p1, p2, fp);
}
//determine and output the winner
//Wait
scanf("%d", &turn);
}
头文件:
#pragma once
#ifndef TOC
#define TOC
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
/*
Outputs the current game board to file
*/
void output(char *board, char *p1, char *p2, FILE *myfile);
/*
Receives
*p1 - player 1 pointer
*p2 - player 2 pointer
turn - the argument to determine which player to move
*board - the size of the board
Outputs the player number, randomly generates a move from 1-6 for the player,
determines if the player has landed on an event, and moves accordingly,
checks and handles player collison,
outputs the amount the player moved and where they are now
*/
void move(char **p1, char **p2, int turn, int boardSize);
#endif
Mechanics.cpp
#include "TableOfContents.h"
void output(char *board, char *p1, char *p2, FILE *myfile)
{
//the loop will exist once you have reached \0
fprintf(myfile, "%s\n", board);
//TODO: show the player locations
}
/*
Moves a player and outputs the result of each players move
*/
void move(char **p1, char **p2, int turn, int boardSize)
{
//roll the dice
int r = (int) (1 + (rand() % 5)); // returns a pseudo-random integer from 1 to 6
//REMOVE: tracer code
if (r > 6 || r == 0) printf("The dice have sinned.\n");
//Apply the dice roll based on whose turn it is
if (turn % 2 == 1)//Odd turn; Player 1's turn
{
printf("%p ", p1 + r);
*p1++;
}
else if (turn % 2 == 0) //Even turn; Player 2's turn
{
printf("%p\n", p2);
p2 += r;
}
}
你为什么要为'p1'和'p2'做不同的事情? –
算术运行正常。你没有在任何地方分配结果。 –
'c'中的所有内容都是按值传递的。当你将'p1'和'p2'传递给'move'时,这些指针的本地拷贝将在函数中完成,并且一旦函数退出就会丢失。如果你想实际改变'move'中的指针值,你需要将'p1'和'p2'的地址传递给'move',并将其定义改为'void move(char ** p1,char ** p2 ...)' – yano