gpt4 book ai didi

c - 将 2D 数组传递给采用指针的函数

转载 作者:行者123 更新时间:2023-11-30 20:58:28 26 4
gpt4 key购买 nike

#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现在变成了一维指针?

如你所见
func() 中的 *(ptr) 输出 8;func() 中的 *(ptr + 1) 输出 7;它们都是数组中的数字,但是,ptr应该是2D指针,(因为[]与*匹配,因此*ptr[8]应该与**ptr匹配) .
所以 *(ptr + 1)*(ptr) 应该是一维指针,而不是数字?

最佳答案

您有几个问题。

首先,您声明 func 来获取 char **,但稍后将其定义为获取 int *[8],这不会不匹配。更糟糕的是,两者都是错误的 - 或者更确切地说,它们与您传递的参数类型不匹配。

除非它是 sizeof 或一元 & 运算符的操作数,否则为“N-element of ”类型的表达式 T”将被转换(“衰减”)为“指向T的指针”类型的表达式,并且表达式的值将是第一个元素的地址。

当您将 ptr 传递给 func 时,它会从类型“int 的 3 元素数组的 2 元素数组”转换为“指向 int 的 3 元素数组的指针”,或 int (*)[3]。所以函数原型(prototype)需要是

void func( int (*ptr)[3] )

void func( int ptr[][3] )

因为您的函数定义和声明不匹配,并且两者都不匹配参数的实际类型,所以您会得到意外的输出。您应该收到有关函数参数类型不匹配的警告;如果没有,您可能需要提高警告级别。

关于c - 将 2D 数组传递给采用指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52359565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com