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