Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的数组语法和指针_C_Arrays_String_Pointers_Malloc - Fatal编程技术网

C语言中的数组语法和指针

C语言中的数组语法和指针,c,arrays,string,pointers,malloc,C,Arrays,String,Pointers,Malloc,我对C语言中数组的理解正确吗? 数组只不过是一种语法上的便利,例如,当您在C代码中声明一个数组时: type my_array[x]; 编译器将其视为等同于: type *my_array = malloc(sizeof(*my_array) * x); 使用free系统调用,一旦我们离开my\u array的范围,就会释放my\u array 一旦声明了my_数组 my_array[y]; 只不过是: *(my_array + y) 将其转换为字符串;我还想知道幕后发生了什么 cha

我对C语言中数组的理解正确吗? 数组只不过是一种语法上的便利,例如,当您在C代码中声明一个数组时:

type my_array[x];
编译器将其视为等同于:

type *my_array = malloc(sizeof(*my_array) * x);
使用
free
系统调用,一旦我们离开
my\u array
的范围,就会释放
my\u array

一旦声明了my_数组

my_array[y];
只不过是:

*(my_array + y)

将其转换为字符串;我还想知道幕后发生了什么

char *my_string = "Hello"


如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样飞翔,那么它就是鸭子


那么,让我们看看。正如您正确描述的那样,数组和指针具有一些公共属性,但是,您可以看到它们之间存在一些差异。阅读更多信息。

如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样飞翔,那么它就是鸭子


那么,让我们看看。正如您正确描述的那样,数组和指针具有一些公共属性,但是,您可以看到它们之间存在一些差异。阅读更多信息。

不,数组对象就是数组对象。C有一些奇怪的规则,使数组和指针看起来是一样的,或者至少非常相似,但它们肯定不是

本声明:

int my_array[100];
创建一个数组对象;对象的大小为
100*sizeof(int)
。它不创建指针对象

没有
malloc()
,即使是隐式的。my_数组的存储分配方式与同一作用域中声明的任何对象的存储分配方式相同

可能让您感到困惑的是,在大多数(但不是所有)上下文中,数组类型的表达式隐式转换为指向数组第一个元素的指针。(这会给您一个指针值;仍然没有指针对象。)如果数组表达式是一元
&
sizeof
的操作数,则不会发生此转换
&my_array
提供数组的地址,而不是某个不存在的指针obejct的地址
sizeof my_数组
是整个数组的大小(100*sizeof(int)`),而不是指针的大小

此外,如果使用数组类型定义函数参数:

void func(int param[]) { ... }
它在编译时调整为指针:

void func(int *param) { ... }
这不是一种转换;在该上下文中(并且仅在该上下文中),
int-param[]
实际上意味着
int*param

此外,数组索引:

my_array[3] = 42;
是根据指针算法定义的,这意味着必须先将前缀
my_array
转换为指针,然后才能对其进行索引

要记住的最重要的一点是:数组不是指针。指针不是数组

报告的第6节很好地解释了这一切

一旦声明了我的_数组

my_数组[y]

只不过是:

*(我的数组+y)

是的,因为
my_array
被转换为指针,并且
[]
操作符被定义为
x[y]
意味着
*(x+y)

将其转换为字符串;我还想知道那是什么 幕后发生的

char*my\u string=“Hello”

my\u string=“Hello”

“Hello”
是字符串文本。它是一个
char[6]
类型的表达式,表示一个匿名静态分配的数组对象。如果它出现在赋值或初始值设定项的RHS上,它将像任何数组表达式一样转换为指针。第一行初始化
my_string
,因此它指向
的第一个字符“Hello”
。第二个是做同样事情的指针赋值

那么这个呢

char str[] = "Hello";
这是第三个不发生数组到指针转换的上下文
str
从字符串文本的大小中获取其大小,并将数组复制到
str
。这与:

char str[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

不,数组对象是数组对象。C有一些奇怪的规则,使数组和指针看起来是一样的,或者至少非常相似,但它们肯定不是

本声明:

int my_array[100];
创建一个数组对象;对象的大小为
100*sizeof(int)
。它不创建指针对象

没有
malloc()
,即使是隐式的。my_数组的存储分配方式与同一作用域中声明的任何对象的存储分配方式相同

可能让您感到困惑的是,在大多数(但不是所有)上下文中,数组类型的表达式隐式转换为指向数组第一个元素的指针。(这会给您一个指针值;仍然没有指针对象。)如果数组表达式是一元
&
sizeof
的操作数,则不会发生此转换
&my_array
提供数组的地址,而不是某个不存在的指针obejct的地址
sizeof my_数组
是整个数组的大小(100*sizeof(int)`),而不是指针的大小

此外,如果使用数组类型定义函数参数:

void func(int param[]) { ... }
它在编译时调整为指针:

void func(int *param) { ... }
这不是一种转换;在该上下文中(并且仅在该上下文中),
int-param[]
实际上意味着
int*param

此外,数组索引:

my_array[3] = 42;
是根据指针算法定义的,这意味着必须先将前缀
my_array
转换为指针,然后才能对其进行索引

要记住的最重要的一点是:数组不是指针。指针不是数组

报告的第6节很好地解释了这一切

一旦声明了我的_数组

my_数组[y]

只不过是:

*(我的数组+y)

是的,因为
my_数组
被转换为指针,并且
[]
运算符被定义为
x[y]
意味着
*(x+y)