C指针和数组

C指针和数组,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,我了解到: char ar[] 是一样的吗 char *ar 这三句话: char ar[][] //1 char *ar[] //2 char **ar //3 char ar[] char ar[][] 编译器也是这样吗 这两种说法: char ar[][] //1 char *ar[] //2 char **ar //3 char ar[] char ar[][] 将在堆栈上分配数组,而所有其他数组将在堆上分配它 它们不一样,除了在函数原型中 同样,它们也不一样,只是最后两个

我了解到:

char ar[] 
是一样的吗

char *ar
这三句话:

char ar[][] //1
char *ar[] //2
char **ar //3
char ar[]
char ar[][]
编译器也是这样吗

这两种说法:

char ar[][] //1
char *ar[] //2
char **ar //3
char ar[]
char ar[][]
将在堆栈上分配数组,而所有其他数组将在堆上分配它

  • 它们不一样,除了在函数原型中
  • 同样,它们也不一样,只是最后两个在函数原型中是相同的
  • 所有这些都与堆与堆栈分配无关

  • char-ar[]
    char*ar
    不是一回事。一个是数组,一个是指针。如果你说:

    char ar[10] = {0};
    
    ar[0] == *ar
    
    那么是的,它们都可以被取消引用,并且具有相同的结果。 关于堆与堆栈,这与您所说的无关。。。当变量为静态变量时,会在堆栈外分配变量:

    char ar[10] = {0};  // this is allocated off the stack.
    
    变量是动态的时,会从堆外分配:

    char *a = malloc(10); //this is from the heap
    
    静态分配内存时,例如

    char a[10]; // this goes on stack
    
    何处为

    char *a = malloc(10); // this goes on heap and needs to be freed by the programmer
    
    一个可能常见的情况是,您使用字符**A分配了一个数组数组,即A的每个元素也是一个字符数组。然后可以使用语法a[x][y]访问其中的任何一个元素

    另一个区别是char*a是一个指针变量,即a可以重新分配到另一个地址,其中as char a[]将返回一个指针常量,并且不能重新分配。

    1) 两者不相同,但在将数组传递到函数中时,它被视为 指针

    (二)

    ar是一个具有10行10列的二维数组

    char *ar[]
    
    ar是包含“char”类型指针的数组

    char **ar
    
    ar是指向“char”类型指针的点

    (三)

    两者都从堆栈中分配内存。要从堆中分配内存,则 必须使用动态内存分配概念。艾:马洛克


    希望这有帮助。:)

    char ar[]
    仅在
    ar
    为函数参数时与
    char*ar
    相同。否则,它们分别是数组和指针

    如果
    ar
    不是函数参数,则
    char ar[][]
    是一个二维数组。否则它就是指向一维数组的指针

    如果
    ar
    不是函数参数,则
    char*ar[]
    是指针的一维数组。否则它是指向指针的指针

    char**ar
    是指向指针的指针

    基本上,如果它是一个函数参数,看起来像是一个数组,那么它实际上是指向数组第一个元素的指针。数组不是作为函数参数整体传递的。当您尝试这样做时,您将向数组的第一个元素传递指针,而不是数组本身

    函数外部定义的所有变量既不在堆中也不在堆栈中。它们是全局变量

    函数内部定义的所有变量(静态变量除外)都在堆栈上<代码>静态变量是全局变量,它们既不在堆中也不在堆栈中<代码>静态降低全局变量对函数或模块范围的可见性,仅此而已


    只有通过
    malloc()
    calloc()
    ralloc()
    显式分配的变量才存在于堆中。一些标准库函数可能会在堆中创建变量/对象,例如
    fopen()

    问题是数组包含的信息比指针更多。您可以确定数组的大小,编译器知道。例如,
    “Hello”
    的类型是常量字符[6]。注意尺寸。以下代码片段演示了:

    #include <stdio.h>
    
    int main()
    {
        const char array[] = "Hello";
        char* pointer = "Hello";
        printf("Array: %d - Pointer: %d", sizeof(array), sizeof(pointer))
        return 0;
    }
    
    对于数组,编译器可以知道大小,因为它们总是在编译时知道的。然而,指针通常是在运行时确定的,这就是为什么它们通常与动态分配的内存相关联


    一种非常简单的思考方式是数组是“整体”,而指针只是对第一个元素的引用。

    我建议您特别阅读第4、5和6节。这些都不会分配任何内容。没有在任何位置指定数组维度,也没有对malloc的调用。的可能重复
    #include <stdio.h>
    
    int main()
    {
        const char array[] = "Hello";
        char* pointer = "Hello";
        printf("Array: %d - Pointer: %d", sizeof(array), sizeof(pointer))
        return 0;
    }
    
    Array: 6 - Pointer: 4