我了解到:
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[]; 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[] 将返回一个指针常量并且不能重新分配。
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
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。
希望这可以帮助。:)
char ar[]
仅与char *ar
whenar
是函数参数相同。否则它们分别是一个数组和一个指针。
char ar[][]
ar
如果不是函数参数,则为二维数组。否则它是一个指向一维数组的指针。
char *ar[]
ar
如果不是函数参数,则为一维指针数组。否则它是指向指针的指针。
char **ar
是指向指针的指针。
基本上,如果它是一个函数参数并且看起来像一个数组,它实际上是一个指向数组第一个元素的指针。数组不作为函数参数整体传递。当您尝试这样做时,您会将指针传递给数组的第一个元素,而不是数组本身。
在函数之外定义的所有变量既不在堆中也不在堆栈中。它们是全局变量。
函数内部定义的所有变量(static
变量除外)都在堆栈上。static
变量是全局变量,它们既不在堆中也不在堆栈中。static
减少全局变量对函数或模块范围的可见性,仅此而已。
只有那些通过malloc()
,显式分配calloc()
的变量ralloc()
存在于堆中。一些标准库函数可能会在堆中创建变量/对象,例如fopen()
.
问题是数组包含比指针更多的信息。您可以确定数组的大小,编译器也知道。例如, 的类型"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
对于数组,编译器知道大小就可以了,因为它们在编译时总是已知的。然而,指针通常是在运行时确定的,这就是为什么它们通常与动态分配的内存相关联。
一种真正简化的思考方式是数组是“整体”,而指针只是对第一个元素的引用。