指针算术不起作用

时间:2017-10-12 19:31:06

标签: c pointers

我试图做一些指针运算,出于某种原因,指针在退出循环后没有保留地址的变化。

我的输出是重复打印的数组(WHOLE数组)的指针地址,不会改变。

打印一个值的地址应该是什么,然后在骰子滚动之后将指针移动到阵列中的许多位置并在下一次打印时进行打印。

编辑:我不是在写一个链表。我可以在这里找到我想要做的确切示例:TutorialsPoint.com | C - Pointer arithmetic但是,虽然我可以运行该示例代码并使其完美运行,但我的代码每次都会失败。

编辑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;
}
}

2 个答案:

答案 0 :(得分:0)

首先,你的p1和p2变量不会在连续调用move函数时发生变化,因为你是按值传递指针。见What's the difference between passing by reference vs. passing by value?

其次,您需要解决的代码中还有其他几个错误。这条线就是其中之一。它没有做你的评论所说的。

int r = 1 + (rand() % 5);      // returns a pseudo-random integer from 1 to 6

答案 1 :(得分:0)

这件事完全是因为我误读了我应该做的事情。 我应该返回一个char指针,而不是函数为void。

我现在很尴尬,我不介意将其删除。