C语言嵌套数组创建报错求助:整数转指针未强制转换警告
问题分析与解决方案
错误原因
- 指针数组初始化错误:
int* array1[]是存储int类型指针的数组,直接将int变量a、b赋值给它,相当于把整数强制转换为指针地址,这就是initialization makes pointer from integer without a cast警告的来源。 - 打印逻辑错误:
topArray[i]是指向子数组的指针,用%d格式化打印会输出该指针的内存地址,而非数组元素的实际数值。
正确实现方式
方案1:多维数组直接实现(推荐,简单直观)
如果需要固定结构的嵌套数组,直接使用多维数组无需指针操作,代码更易维护:
#include <stdio.h> int main(){ int arrayprint; // 定义2x2二维数组,扩展4维只需写成 int arr[dim1][dim2][dim3][dim4] int topArray[2][2] = {{10, 20}, {30, 40}}; int i, j, count = 0; printf("Amount of matrix items to print? (Maximum 4):\n"); scanf("%d", &arrayprint); printf("\nYou chose %d items.", arrayprint); // 遍历数组打印指定数量的元素 for (i = 0; i < 2 && count < arrayprint; i++) { for (j = 0; j < 2 && count < arrayprint; j++) { printf("\n%d", topArray[i][j]); count++; } } return 0; }
方案2:修正指针数组实现
若坚持使用指针数组的嵌套结构,需修正指针初始化与打印时的解引用操作:
#include <stdio.h> int main(){ int arrayprint; int a = 10; int b = 20; int c = 30; int d = 40; // 指针数组存储变量的内存地址 int* array1[] = {&a, &b}; int* array2[] = {&c, &d}; // 二级指针数组存储子指针数组的地址 int** topArray[] = {array1, array2}; int i, j, count = 0; printf("Amount of matrix items to print? (Maximum 4):\n"); scanf("%d", &arrayprint); printf("\nYou chose %d items.", arrayprint); // 遍历并解引用指针获取元素值 for (i = 0; i < 2 && count < arrayprint; i++) { for (j = 0; j < 2 && count < arrayprint; j++) { printf("\n%d", *topArray[i][j]); count++; } } return 0; }
扩展到4维数组
如果需要创建4维数组,直接使用多维数组的写法最清晰,示例如下:
#include <stdio.h> int main(){ // 定义2x2x2x2的4维数组,维度可按需调整 int fourDimArray[2][2][2][2] = { {{{1,2},{3,4}}, {{5,6},{7,8}}}, {{{9,10},{11,12}}, {{13,14},{15,16}}} }; int i,j,k,l, count=0, printNum; printf("Enter number of items to print (max 16): "); scanf("%d", &printNum); // 四层循环遍历4维数组 for(i=0;i<2&&count<printNum;i++){ for(j=0;j<2&&count<printNum;j++){ for(k=0;k<2&&count<printNum;k++){ for(l=0;l<2&&count<printNum;l++){ printf("%d ", fourDimArray[i][j][k][l]); count++; } } } } return 0; }
内容的提问来源于stack exchange,提问作者kc01
相关产品推荐
相关产品推荐

