将 int ** 分配给 int 指针
Posted
技术标签:
【中文标题】将 int ** 分配给 int 指针【英文标题】:Assigning int ** to an int pointer 【发布时间】:2020-04-15 14:47:06 【问题描述】:对不起,这个奇怪的问题。我编写了以下程序:
#include <stdio.h>
int main()
int a[2];
int **vararr = (int **)a;
int testarr[]= 1, 2 ,3;
printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
vararr[0] = (int *)testarr;
printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
printf("%d %d %d\n", vararr[0][0], vararr[0][1], vararr[0][2]);
返回:
1 2 3
32765 2 3
32765 2 3
我期待:vararr[0][0] == 1 && testarr[0] == 1
如果我重新运行程序,32765 将更改 +-2
我真的不明白我做错了什么。我找不到任何关于我的问题的信息,因为我真的不知道如何正确地制定它。
【问题讨论】:
您将int *
直接投射到int **
。你期待在这里做什么?您似乎正试图将 int *
存储在 int
中。
你能解释一下int **vararr = (int **)a;
背后的理由吗?为什么?
如何正确分配**vararr?我想要一个 int 指针数组
您能描述一下您要完成的工作吗?通常这种指针hijinks 被认为是“code smell”,因为它难以编写、难以阅读且难以正确处理。通常有更好的方法来编写代码。
您应该尽可能避免指针转换。如果您实际上取消引用一个指针,它应该具有它指向的对象的正确类型。在这种情况下,您将指针值写入整数数组。如果sizeof(int *)
大于sizeof(int)
,你认为会发生什么?未定义的行为。你会破坏你的运行时环境。不要这样做。
【参考方案1】:
int **vararr = (int **)a;
是无效转换,因为类型不兼容。
指向指针的指针:
不是数组 不是二维数组 不能指向数组 不能指向二维数组 可用于指向指针数组的第一个元素这意味着除非你有一个int* array[n]
在某个地方,否则使用int**
是没有意义的。
将int**
替换为int*
,一切正常。
【讨论】:
may be used to point at the first element of an array of pointers
更一般地说,它可用于指向任何指针(适当类型),无论它是数组的第一个元素、第二个元素还是不在数组中全部。【参考方案2】:
您将指向整数的指针(从数组中衰减)重新解释为指向整数的指针。指向的类型(int 和指向 int 的指针)不是指针可互转换的,因此当您尝试通过重新解释的指针间接访问指向的对象时,程序的行为是未定义的。
我想要一个 int 指针数组
您可以像这样声明一个 int 指针数组:
int* ptr_arr[] testarr;
这是一个包含一个元素的数组。该元素是一个指向 int 的指针。它指向testarr
的第一个元素。
【讨论】:
非常感谢,这正是我想要的。如果我想使用 int **ptr_arr,正确的方法是什么? @CelzT[]
可隐式转换为 T*
,因此 int*[]
可隐式转换为 int**
。您可以在任何需要int**
的地方使用ptr_arr
。
@FrançoisAndrieux 我想问,如何初始化数组,使用int ** ptr_arr
。
@Celz 你想用int**
初始化什么样的数组?
@Celz 请在问题部分查看我的最后一条评论。不清楚你在问什么。以上是关于将 int ** 分配给 int 指针的主要内容,如果未能解决你的问题,请参考以下文章