我创建了一种无需使用指针即可随机分配char矩阵的方法。
现在,我需要更改该随机函数的代码,因此它仅使用指针,而不使用下标[][]
。我需要创建2个字符矩阵:一个大(20X3)和一个小(4x4)。
我试图这样做...但是我没有使用指针。这两个矩阵应通过main打印。
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define SIZE 4
#define ROWS 3
#define COLS 20
void matRandomChar(char mat[][COLS], int rows);
void smallMatRandomChar(char smallMat[][SIZE],int size);
void inputMatrix(char **mat,int rows,int cols);
void matRandomChar(char mat[][COLS], int rows)
{
int i,j;
for (i=0; i<rows; i++){
for (j=0; j<COLS; j++)
mat[i][j] = 'A'+rand()%('Z'-'A'+1);
}
}
void smallMatRandomChar(char smallMat[][SIZE],int size)
{
int i,j;
for (i=0; i<size; i++){
for (j=0; j<SIZE; j++)
smallMat[i][j] = 'A'+rand()%('Z'-'A'+1);
}
}
int main()
{
char smallMat[SIZE][SIZE];
char mat[ROWS][COLS];
srand((unsigned int)time(NULL));
matRandomChar(mat,ROWS);
printf("Big matrix:\n");
printMat(mat,ROWS);
smallMatRandomChar(smallMat,SIZE);
printf("Small matrix:\n");
printSmallMat(smallMat,SIZE);
}
我正在Linux上使用Eclipse。
答案 0 :(得分:0)
尽管最简单的更改是将表示法从matrix[i][j]
更改为*(*(matrix + i) + j)
,但您可以注意到数组的所有元素都是连续的,因此可以用更少的功能来制作更简化的代码,因此您可以只需使用指针对数组的元素进行迭代,而无需添加偏移量。
这将导致如下代码:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define SIZE 4
#define ROWS 3
#define COLS 20
void matRandomChar(char *mat, int rows, int cols);
void printMat(const char *tag, char *base, int rows, int cols);
void matRandomChar(char *mat, int rows, int cols)
{
char *end = mat + rows * cols;
while (mat < end)
*mat++ = 'A' + rand() % ('Z' - 'A' + 1);
}
void printMat(const char *tag, char *base, int rows, int cols)
{
int i;
printf("%s (%dx%d):\n", tag, rows, cols);
for (i = 0; i < rows; i++)
{
int j;
for (j = 0; j < cols; j++)
printf(" %c", *base++);
putchar('\n');
}
}
int main(void)
{
char smallMat[SIZE][SIZE];
char mat[ROWS][COLS];
srand((unsigned int)time(NULL));
matRandomChar(&mat[0][0], ROWS, COLS);
printMat("Big matrix", &mat[0][0], ROWS, COLS);
matRandomChar(&smallMat[0][0], SIZE, SIZE);
printMat("Small matrix", &smallMat[0][0], SIZE, SIZE);
return 0;
}
在这两个辅助功能中,代码仅一次单步浏览数组数据。
示例输出:
Big matrix (3x20):
P L J T B F Y L W K C P Q X B P K V D V
K B Q P V X S B K O X C Z S U K T G F I
E X O X H C W B K W V E F U L S O F Q G
Small matrix (4x4):
U C R P
A R F U
N K Q L
Y W R M
此代码将与仅接受C90以及接受C99或更高版本的编译器一起使用。
为了避免重复代码,我可能会使用可变长度数组(VLA)表示法,但是使用下标而不是指针是明智的。但是,可以应用相同的通用技术-尽管使用下标要明智得多。以下代码可以在有或没有-DNO_PRINTING_SUBSCRIPTS
的情况下进行编译-输出具有相同的组织(但是- A
或- B
表示法告诉您使用了哪个打印代码)。
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define SIZE 4
#define ROWS 3
#define COLS 20
void matRandomChar(int rows, int cols, char mat[rows][cols]);
void printMat(const char *tag, int rows, int cols, char mat[rows][cols]);
void matRandomChar(int rows, int cols, char mat[rows][cols])
{
char *ptr = &mat[0][0];
char *end = &mat[0][0] + rows * cols;
while (ptr < end)
*ptr++ = 'A' + rand() % ('Z' - 'A' + 1);
}
#ifdef NO_PRINTING_SUBSCRIPTS
void printMat(const char *tag, int rows, int cols, char mat[rows][cols])
{
printf("%s (%dx%d) - A:\n", tag, rows, cols);
char *ptr = &mat[0][0];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
printf(" %c", *ptr++);
putchar('\n');
}
}
#else
void printMat(const char *tag, int rows, int cols, char mat[rows][cols])
{
printf("%s (%dx%d) - B:\n", tag, rows, cols);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
printf(" %c", mat[i][j]);
putchar('\n');
}
}
#endif /* NO_PRINTING_SUBSCRIPTS */
int main(void)
{
char smallMat[SIZE][SIZE];
char mat[ROWS][COLS];
srand((unsigned int)time(NULL));
matRandomChar(ROWS, COLS, mat);
printMat("Big matrix", ROWS, COLS, mat);
matRandomChar(SIZE, SIZE, smallMat);
printMat("Small matrix", SIZE, SIZE, smallMat);
return 0;
}
编译为-DNO_PRINTING_SUBSCRIPTS
Big matrix (3x20) - A:
R K Y W Y J U T C O F N Z V H Q X T P W
Q Z R T B A O A W J O D I K F I C A R E
V X X C R P C V H E S K G C M T Y B Z D
Small matrix (4x4) - A:
V R E M
P T D G
U C Q F
D Q B F
编译为-UNO_PRINTING_SUBSCRIPTS
Big matrix (3x20) - B:
L C K V S P C T L V B P G U I O Q L E B
N S C Y B I L Y G S F Z C H L Z M G A E
B P A I H E M X H V C M B Z U Y S D W A
Small matrix (4x4) - B:
O N U T
H X X P
P L M L
K R S F