c - 当我将指针传递给函数时,取消引用指向指针的指针不起作用。为什么?(C)
问题描述
我尝试了我能想到的一切。我不知道我是否遗漏了一些明显的东西。为什么会这样:
#include<stdio.h>
void test_matrix(int** matrix)
{
for(int i=0; i<4; i++) {
for(int j=0; j<4; j++) {
printf("%d ", *(matrix+j+4*i));
}
}
/**
for(int i=0; i<4; i++) {
for(int j=0; j<4; j++) {
printf("%d ", *(*(matrix+i)+j));
}
}
*/
}
int main()
{
int matrix[4][4];
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
scanf("%d", &matrix[i][j]);
test_matrix(matrix);
}
但是评论部分不起作用。我也尝试了 matrix[i][j] ,它仍然无法正常工作。我的程序超时。编辑:我在 MAIN 中添加了调用函数。
解决方案
错误在于这个二维数组被布置为 4 x 4 = 16 个整数。但是您的函数需要一个指向指针的指针。
在调用站点matrix
提供的地址作为参数是正确的。但与某些评论者所说的不同,它不是指向数组的指针,int
而是指向数组的指针int
。
要正确处理二维数组的这个地址,您需要告诉它您的函数,如下所示:
void test_matrix(int (*matrix)[4])
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(matrix + i) + j));
}
}
}
或像这样:
void test_matrix(int matrix[][4])
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
}
}
您使用哪种访问方式无关紧要,有时这只是品味问题。这些表达式是等价的,实际上p[i]
是语法糖*(p + i)
:
*(*(matrix + i) + j)
matrix[i][j]
注意 1:正如一些评论者已经建议的那样,您应该将警告级别提高到最大并更正来源,直到处理完所有诊断。
注意 2:当您的数组的维度大小不同时,您需要想办法将这些大小告诉您的函数。
推荐阅读
- python - HuggingFace 文本摘要输入数据格式问题
- javascript - 仅重写部分 HTML 页面的 Javascript
- node.js - 如何从 Nodejs 中的 kubernetes yml 文件中的配置映射中读取变量
- node.js - 指定的组件类型在此上下文中无效 - discord.js V13
- python - Python数据转换为整数
- javascript - 如何更改图像的来源,在另一个元素的innerhtml中?
- python - 如何选择二维 Numpy 数组中的行并将其存储到另一个数组中,以便一个数组保留给定列中具有最高值的行?
- java - 在 android studio 中启动 uiautomatorviewer 时出现 java 版本错误
- pytorch - 仅当当前批次的损失小于前一个时如何更新模型的权重
- android - 尝试使用 LocationManager.getCurrentLocation 获取位置总是返回 null?