在许多编程语言(包括JavaScript,Java和Ruby)中,可以在其自身内部放置一个数组.在这里,我试图在其第三个索引处放置一个C整数数组,但我不确定C编程语言是否支持它:
#include <stdio.h>
int main(void) {
int arr[] = {1, 1, 2};
arr[2] = arr; //now I'm trying to put arr into itself.
printf("%i", arr[2]); //this prints a negative number each time I run the program
printf("%i", arr[2][0]); //prog.c:7:24: error: subscripted value is neither array nor pointer nor vector
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否可以将C数组放入其中,或者根本不可能?
不,一个int包含自身的数组是不可能的.
您可以使用一些(可能是非便携式)技巧,比如使数组中的一个元素成为指向数组的转换指针:
int arr[10];
arr[5] = (int)arr;
Run Code Online (Sandbox Code Playgroud)
但这不会使数组包含自身.表达式arr,因为它是数组类型,被隐式转换("衰减")到指向大多数上下文中的第一个元素的指针,包括这个.因此,假设转换不会丢失任何信息,您可以arr通过转换arr[5]回类型来检索指向第一个元素的指针int*.请注意,这只会给你一个指向arr第一个元素的指针; 它丢失了有关长度的任何信息arr.并且,int*指针值在int不丢失信息的情况下非常常见(在64位系统上,通常为int*64位且int为32位).
整数,指针和数组是三个非常不同的东西.它们不仅仅是可以互换的.
推荐阅读:comp.lang.c FAQ的第6部分; 它很好地解释了C中数组和指针之间经常混淆的关系.
即使在像Java和Ruby这样的语言中,数组实际上也不能包含它自己.它可以包含对自身的引用 - 尽管语言可能提供语法糖,隐藏了它作为参考的事实.在C中,这样的引用通常是明确的.
您可以做的是定义一个数据结构,其中包含指向其自身类型的对象的指针.这通常用结构来完成.例如:
struct tree_node {
int data;
struct tree_node *left;
struct tree_node *right;
};
Run Code Online (Sandbox Code Playgroud)
这是C,您必须明确地管理树节点的内存,使用malloc()分配和free()解除分配 - 或者您可以使用现有的库来为您执行此操作.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |