gpt4 book ai didi

c++ - 传递 &arr(整个 block 的地址)或仅传递数组名称(第一个元素的地址)有什么区别吗?

转载 作者:行者123 更新时间:2023-12-01 23:07:38 27 4
gpt4 key购买 nike

void func1(int* ptr)
{
printf("func1 :%d\n",++ptr);
}

int main()
{
int arr[4] = {0,1,2,3};
printf("Addr enter code here`f arr: %d\n",arr);
func1(arr); // first way:
func1(&arr); // second way: How this will be different from func1(arr).
}

Image showing code run

最佳答案

&arrarr的区别在于前者的类型是一个指向数组int (*)[4]的指针,后者的类型是一个数组int[4],它可以衰减到指向第一个元素int*的指针。指向数组的指针和指向第一个元素的衰减指针都指向相同的地址,因为数组的第一个字节也是数组第一个元素的第一个字节。

func1(&arr)func1(arr) 的区别在于前者格式错误,因为 int (*)[4] 不会隐式转换为 int*。为了能够调用 func1(&arr),您必须接受正确类型的指针:

void func1(int (*ptr)[4])

printf("func1 :%d\n",++ptr);
printf("Addr enter code here`f arr: %d\n",arr);

这两个调用都会导致未定义的行为。可变参数的类型必须与格式说明符所需的类型相匹配。您使用了格式说明符 %d,它要求参数的类型为 int(或类似)。这里的(衰减的)参数的类型是 int* 而不是 int

关于c++ - 传递 &arr(整个 block 的地址)或仅传递数组名称(第一个元素的地址)有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70532706/

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