是否可以将C数组放入其中?

And*_*een 0 c arrays

在许多编程语言(包括JavaScript,JavaRuby)中,可以在其自身内部放置一个数组.在这里,我试图在其第三个索引处放置一个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数组放入其中,或者根本不可能?

Kei*_*son 5

不,一个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()解除分配 - 或者您可以使用现有的库来为您执行此操作.