#include <stdio.h>
void func(int **);
int main(void)
{
int ptr[2][3] = { {8, 7, 3}, {4, 5, 6} };
printf("ptr point is %p\n", ptr);
printf("*ptr point is %p\n", *ptr);
func(ptr);
system("pause");
return 0;
}
void func(int *ptr[8])
{
printf("ptr point is %p\n", ptr);
printf("*ptr point is %p\n", *ptr);
printf("*(ptr + 1) point is %p\n", *(ptr + 1));
}
输出:
ptr point is 004FFC24
*ptr point is 004FFC24
ptr point is 004FFC24
*ptr point is 00000008
*(ptr + 1) point is 00000007
Press any key to continue
为什么ptr
现在变成1D指针?
如您所见
*(ptr)
中的func()
输出8;
*(ptr + 1)
中的func()
输出7;它们是数组中的所有数字,
但是,ptr
应该是2D指针,(因为[]与*匹配,因此*ptr[8]
应该与**ptr
匹配)。
因此*(ptr + 1)
和*(ptr)
应该是一维指针,而不是数字?
答案 0 :(得分:1)
您有几个问题。
首先,您声明func
采用char **
,但随后将其定义为采用int *[8]
,这不匹配。更糟糕的是,两者都是错误的-或者,它们与您要传递的参数类型不匹配。
除非它是sizeof
或一元&
运算符的操作数,否则将转换类型为“ T
的N元素”的表达式 (“衰减”)到类型为“ T
的指针”的表达式,该表达式的值将是第一个元素的地址。
当您将ptr
传递到func
时,它会从类型“ {{1}的3元素数组的2元素数组””转换为“ {的指针指向3元素的数组。 {1}}”或int
。所以功能原型应该是
int
或
int (*)[3]
由于您的函数定义和声明不匹配,并且由于两者都不匹配参数的实际类型,因此您会得到意外的输出。您应该收到有关函数参数类型不匹配的警告;否则,您可能需要提高警告级别。