c - C:处理二维数组的列
问题描述
#include<stdio.h>
#define NUM_ROWS 3
#define NUM_COLS 5
int main(void){
int a[NUM_ROWS][NUM_COLS],(*p)[NUM_COLS], i;
for (p = &a[0],i=0; p < &a[NUM_ROWS]; p++,i++){
(*p)[i]=i;
}
printf("The value of a[0][0] is %d\n",a[0][0]); // I want 0
printf("The value of a[0][1] is %d\n",a[0][1]); // 1
printf("The value of a[0][2] is %d\n",a[0][2]); // 2
printf("The value of a[0][3] is %d\n",a[0][3]); // 3
printf("The value of a[0][4] is %d\n",a[0][4]); // 4
return 0;
}
大家好,我是 C 新手,我正在尝试了解如何处理 2D 数组的列。
我想从第 0 行的列中输出 0、1、2、3、4,但我得到了这些结果
The value of a[0][0] is 0
The value of a[0][1] is 0
The value of a[0][2] is 1
The value of a[0][3] is 0
The value of a[0][4] is -1
我试图找出问题所在,但我没有......
如果有人解释我的代码有什么问题,我将不胜感激。
解决方案
您在循环中的分配是初始化前导对角线:
(*p)[i] = i;
为了说明,这是您的代码的改编版,它打印整个矩阵(并对其进行初始化):
#include <stdio.h>
#include <string.h>
#define NUM_ROWS 3
#define NUM_COLS 5
int main(void)
{
int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i;
/* Set all elements to -1 assuming 2's complement */
memset(a, 0xFF, sizeof(a));
for (p = &a[0], i = 0; p < &a[NUM_ROWS]; p++, i++)
{
(*p)[i] = i;
}
for (i = 0; i < NUM_ROWS; i++)
{
for (int j = 0; j < NUM_COLS; j++)
printf("%3d", a[i][j]);
putchar('\n');
}
return 0;
}
输出是:
0 -1 -1 -1 -1
-1 1 -1 -1 -1
-1 -1 2 -1 -1
请注意,前对角线上的三个元素设置为 0、1、2,其余为 -1,由 设置memset()
。
如果要初始化第一行,则只需使用:
int (*p)[NUM_COLS] = &a[0];
for (int i = 0; i < NUM_COLS; i++)
(*p)[i] = i;
或者,更简单地说,忘记p
并使用:
for (int i = 0; i < NUM_COLS; i++)
a[0][i] = i;
如果要初始化第 0 列,则需要:
(*p)[0] = i;
或者,更简单地说,忘记p
并使用:
for (int i = 0; i < NUM_ROWS; i++)
a[0][i] = i;
推荐阅读
- android - 此服务需要以下应用程序的最新版本 华为移动服务 hms core
- c# - 如何使用嵌套属性使用 LINQ 对列表进行排序
- java - Java BigInteger 源代码性能基准测试
- spring-boot - 如何从多个应用程序实例同时运行相同的弹簧批处理作业
- android - 在 Android 中,如何为缓存的图像设置 Glide 签名(缓存到期)
- flutter - 使用前缀设置 TextFormField 的宽度大小以匹配普通 TextFormField
- pycharm - 在现有 conda 环境中具有相同 python 可执行文件的解释器
- python - TypeError:图像数据的尺寸无效
- android - 你怎么称呼这种类型的通知(?),它在 Flutter 中可用吗?
- python - 如何将 [N * 1 * M] 值仅分配给 [N*M*M] 数组的对角线?