Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将二维整数数组作为双指针传递给函数,而将二维字符串数组作为双指针传递给函数,则不会';你的行为不一样吗?_C_Function_Pointers_Multidimensional Array_Pointer To Pointer - Fatal编程技术网

C 将二维整数数组作为双指针传递给函数,而将二维字符串数组作为双指针传递给函数,则不会';你的行为不一样吗?

C 将二维整数数组作为双指针传递给函数,而将二维字符串数组作为双指针传递给函数,则不会';你的行为不一样吗?,c,function,pointers,multidimensional-array,pointer-to-pointer,C,Function,Pointers,Multidimensional Array,Pointer To Pointer,您好,我正在尝试理解将char类型的2d数组与将int类型的2d数组作为双指针func(int**ptr)参数传递给函数之间的区别。问题是它的行为不同。下面我将展示使用PythonTutor for C的类型char和int的两个示例 我查看了整个互联网,询问了一些朋友,但找不到关于这种行为的答案 类型为char的示例: int func(字符**arr) int类型的示例: int func(int **arr) { printf("%d", **arr); } int main()

您好,我正在尝试理解将
char
类型的2d数组与将
int
类型的2d数组作为双指针
func(int**ptr)
参数传递给函数之间的区别。问题是它的行为不同。下面我将展示使用PythonTutor for C的类型
char
int
的两个示例

我查看了整个互联网,询问了一些朋友,但找不到关于这种行为的答案

类型为char的示例: int func(字符**arr)

int类型的示例:

int func(int **arr)
{
  printf("%d", **arr);  
}
int main() 
{
  int *arr[] = {{1,3},{4,5,6}};
  return 0;
}
需要注意的一点是,func体在传递给它的双指针上做什么并不重要,我试图理解的问题是,为什么在2D char数组中,双指针指向整数指针,而2D int数组不指向数组中的整数

下面是pythontutor对这两种情况的可视化

char 2D数组类型的示例:

int 2D array类型的示例:

还提供最终结果的快照:

char 2D数组类型的示例:

int 2D array类型的示例:


int*arr[]
不是二维数组,它是指向int的指针数组。
int-arr[x][y]
x&y
是整数文本,用于创建二维数组。(访问时将转换为指向第一个元素的指针(这是指向第一个1D数组的指针,例如指向int[y]数组的指针),它与
int**
(这只是指向int的指针)不同。
type*arr[]
是指针数组。下面是什么,例如
char*arr[]={“一”,“二”}
必须是指针。对于
int*arr[];
您需要例如
inta[]={1,2,3];
intb[]={3,4,5};
,然后
int*arr[]={a,b}
因为
a
b
都将在访问时转换为指针。另外,2D数组实际上是1D数组的数组。可以表示为
int-arr[x][y];
int(*arr)[y];
So
type(*arr)[y];
是指向数组的指针。这个答案可能会有更大的帮助。有更多的重复项,有些比其他的好,不幸的是,这些重复项是如此“相关”页面右侧的链接并不能很好地找到它们。请看,那里的答案可能更有启发性。我仍在寻找更完整的答案,但这个问题很好。这里还有一个问题会有所帮助(也请阅读评论)。您可以找到更多的问题和答案,但鉴于问题的原始标题中描述了不同的问题,没有一个特定的搜索可能找到所有问题和答案。这些问题都归结为理解数组/指针转换是如何工作的。这是前面链接的第6.3.2.1节。现在值得一提,这将节省您几个小时的时间。
int*arr[]
不是2D数组,它是指针到int的数组。
int-arr[x][y]
with
x&y
是整数文本创建2D数组。(访问时将转换为指向第一个元素的指针(这是指向第一个1D数组的指针,例如指向int[y]数组的指针)这与
int**
(它只是指向int的指针)不同。
type*arr[]
是一个指针数组。下面的内容,例如
char*arr[]={“一”,“二”};
必须是指针。对于
int*arr[];
您需要例如
inta[]={1,2,3];
intb[]={3,4,5};
,然后
int*arr[]={a,b};
因为
a
b
都将在访问时转换为指针。另外,2D数组实际上是1D数组的数组。您可以表示为
int-arr[x][y];
int(*arr)[y];
So
type(*arr][y];
是指向数组的指针。这个答案可能会有更大的帮助。有更多的重复项,有些比其他的好,不幸的是,这些重复项是如此“相关”页面右侧的链接并不能很好地找到它们。请看,那里的答案可能更有启发性。我仍在寻找更完整的答案,但这个问题很好。这里还有一个问题会有所帮助(也请阅读评论)。您可以找到更多的问题和答案,但鉴于问题的原始标题中描述了不同的问题,没有一个特定的搜索可能找到所有问题和答案。这些问题都归结为理解数组/指针转换是如何工作的。这是前面链接的第6.3.2.1节。现在值得一提,这样可以节省你几个小时以后的时间。
int func(int **arr)
{
  printf("%d", **arr);  
}
int main() 
{
  int *arr[] = {{1,3},{4,5,6}};
  return 0;
}