2

我了解到:

char ar[] 

是一样的

char *ar

这三个表达式:

char ar[][] //1
char *ar[] //2
char **ar //3

编译器是一样的吗?

这两个表达式:

char ar[]
char ar[][]

将在堆栈上分配数组,而所有其他人将在堆上分配它?

4

6 回答 6

4
char ar[]; creates an array of characters when size is specified.

char * ar; creates a character pointer. Might point to even a single or more characters.

char ar[][]; when size is specified, creates a 2 dimensional array.
char *ar[]; creates an array of character pointers
char **ar; a pointer to pointer to character.

当您静态分配内存时,例如

char a[10]; // this goes on stack

然而

char *a = malloc(10); // this goes on heap and needs to be freed by the programmer

一个可能常见的事情可能是您使用 char **a 分配了一个数组数组,即 a 的每个元素也是一个字符数组。然后可以使用语法 a[x][y] 访问其中的任何一个元素

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

于 2012-10-01T12:12:36.420 回答
3
  1. 它们不一样,除了函数原型。
  2. 同样,它们并不相同,只是最后两个在函数原型中是相同的。
  3. 这些都与堆与堆栈分配无关。
于 2012-10-01T12:07:24.380 回答
3

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
于 2012-10-01T12:10:24.863 回答
1

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

2)

int ar[10][10]

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

char *ar[]

ar 是包含“char”类型指针的数组。

char **ar

ar 是指向“char”类型的指针。

3)

char ar[20]
char ar[10][10]

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

希望这可以帮助。:)

于 2012-10-01T12:13:58.510 回答
1

char ar[]仅与char *arwhenar是函数参数相同。否则它们分别是一个数组和一个指针。

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

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

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

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

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

函数内部定义的所有变量(static变量除外)都在堆栈上。static变量是全局变量,它们既不在堆中也不在堆栈中。static减少全局变量对函数或模块范围的可见性,仅此而已。

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

于 2012-10-01T12:15:30.230 回答
0

问题是数组包含比指针更多的信息。您可以确定数组的大小,编译器也知道。例如, 的类型"Hello"const char[6]。注意大小。以下片段说明:

#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

对于数组,编译器知道大小就可以了,因为它们在编译时总是已知的。然而,指针通常是在运行时确定的,这就是为什么它们通常与动态分配的内存相关联。

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

于 2012-10-01T12:23:07.247 回答