小白求教 c函数的参数指针问题

HawkJW 2018-09-17 11:28:10
    #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));
}

Output:

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

main中传递给func() shu的地址,
而func的参数int *ptr[8] 应该可以理解为一个二维指针。
为什么这里变成一维指针了?(从*shu = 7可以看出来)
谢谢回答与帮助
...全文
315 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-09-18
  • 打赏
  • 举报
回复
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
HawkJW 2018-09-18
  • 打赏
  • 举报
回复
引用 1 楼 hou09tian 的回复:
func()函数的参数本身就是一个一维数组,并不是二维数组,所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为
void func(int ptr[2][3])
{
	printf("ptr point is %p\n", ptr);
	printf("*ptr point is %p\n", *ptr);
	printf("*(ptr + 1) point is %p\n", **(ptr + 1));
}
此时,输出为 此时func()函数的参数是一个二维数组,ptr+1指向的是二维数组的第二个元素,即第二个一维数组。 请参考《C++中对数组名的运算》 希望能够帮到你
非常感谢您的回答。 但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针,则 ptr 等效为指针的指针? 作为小白,在我的认知里就是 [] 和 *不是可以匹配相等么, 那么* ptr[8] 可以匹配**ptr? 谢谢帮助
HawkJW 2018-09-18
  • 打赏
  • 举报
回复
非常感谢你们的回答。 但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针,则 ptr 等效为指针的指针? 作为小白,在我的认知里就是 [] 和 *不是可以匹配相等么, 那么* ptr[8] 可以匹配**ptr? 谢谢帮助
636f6c696e 2018-09-18
  • 打赏
  • 举报
回复
你写的int *ptr[8]不就是一维数组指针么?
636f6c696e 2018-09-18
  • 打赏
  • 举报
回复
你写的就是一位数组啊
棉猴 2018-09-18
  • 打赏
  • 举报
回复
func()函数的参数本身就是一个一维数组,并不是二维数组,所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为
void func(int ptr[2][3])
{
printf("ptr point is %p\n", ptr);
printf("*ptr point is %p\n", *ptr);
printf("*(ptr + 1) point is %p\n", **(ptr + 1));
}

此时,输出为

此时func()函数的参数是一个二维数组,ptr+1指向的是二维数组的第二个元素,即第二个一维数组。
请参考《C++中对数组名的运算》
希望能够帮到你
帅得不敢出门 2018-09-18
  • 打赏
  • 举报
回复
数组传参,弱化成指针
棉猴 2018-09-18
  • 打赏
  • 举报
回复
引用 5 楼 Eagle_hwei 的回复:
[quote=引用 1 楼 hou09tian 的回复:]
func()函数的参数本身就是一个一维数组,并不是二维数组,所以ptr+1只能指向该数组的第二个元素。如果把func()的代码修改为
void func(int ptr[2][3])
{
printf("ptr point is %p\n", ptr);
printf("*ptr point is %p\n", *ptr);
printf("*(ptr + 1) point is %p\n", **(ptr + 1));
}

此时,输出为

此时func()函数的参数是一个二维数组,ptr+1指向的是二维数组的第二个元素,即第二个一维数组。
请参考《C++中对数组名的运算》
希望能够帮到你

非常感谢您的回答。
但是难道 *ptr[8]不是由指针构成的数组,而ptr作为数组名是指针,则 ptr 等效为指针的指针?
作为小白,在我的认知里就是 [] 和 *不是可以匹配相等么, 那么* ptr[8] 可以匹配**ptr?
谢谢帮助[/quote]
* ptr[8] 可以匹配**ptr
可以看一下func()函数的声明
void func(int **);
func()函数的定义
void func(int *ptr[8])
这就说明了可以匹配。
但是需要注意的是,在func()函数的定义中,该函数的形参ptr是一个一维数组,该数组中的元素类型是int*。所以ptr+1指向的是该数组中的第二个元素。
wodeyouxian 2018-09-18
  • 打赏
  • 举报
回复
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));
}
=============
这一句,void func(int *ptr[8])中的int * ptr[8],是定义了一个有8个元素的int指针数组,这个指针数组里的每一个元素都是一个int指针。

主函数中的int ptr[2][3] = { {8, 7, 3}, {4, 5, 6} };这一句是定义了一个二维数组,作函数参数时,它应该是数组指针,即应该定义为 int (*ptr)[3],

而楼主的程序写法是将一个二维数组的首地址传给了一个指针数组的首元素,由于C编译器使用线性的方式存放二维数组,子函数中的ptr事实上是分别指向了二维数组的元素(当然,最后2个指针越界了)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧