Arrays 数组名和指针之间的差异

Arrays 数组名和指针之间的差异,arrays,c,pointers,Arrays,C,Pointers,数组名实际上是否类似于键入数组第一个元素的地址 根据我对数组名称的理解 数组名变量不是一个有自己内存地址的指针,它的内容是数组第一个元素的地址 但这是一种用简单的英文名称键入第一个元素地址的方法 我现在将试着从视觉上解释它 考虑下面的代码,它将与我将要向您展示的图像相关 char[] text = "Hey"; char *ptr = text; 现在看看这张图片 *ptr变量有自己的内存地址,指针的内容是H的内存地址,即0101 现在,当我们键入text C时,text变

数组名实际上是否类似于键入数组第一个元素的地址

根据我对数组名称的理解

数组名变量不是一个有自己内存地址的指针,它的内容是数组第一个元素的地址

但这是一种用简单的英文名称键入第一个元素地址的方法

我现在将试着从视觉上解释它

考虑下面的代码,它将与我将要向您展示的图像相关

char[] text = "Hey";
char *ptr = text;
现在看看这张图片

*ptr变量有自己的内存地址,指针的内容是H的内存地址,即0101

现在,当我们键入text C时,text变量没有自己的内存地址,将其解释为内存地址0101

所以基本上文本是0101


我说得对吗?

嗯,差不多,但不完全对

text是char[4]类型的变量,它是一个char数组。现在,根据规范第6.3.2.1/P3章

除非它是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为array of type的表达式将转换为类型指针指向类型的表达式,该类型指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义

也就是说

char * ptr = text;
和写作一样

char * ptr = &text[0];
也就是说

现在,当我们键入text C时,text变量没有自己的内存地址,将其解释为内存地址0101


不,这是错误的。变量text有一个地址try do&text,它将是char*[4]类型。现在,由于数组是连续内存位置中相同对象成员对象类型的集合,因此数组的地址是数组第一个元素的地址,因此在打印数组地址时,数组的第一个元素的地址将是相同的-但是请记住,它们的类型确实不同。

嗯,差不多,但不完全一样

text是char[4]类型的变量,它是一个char数组。现在,根据规范第6.3.2.1/P3章

除非它是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为array of type的表达式将转换为类型指针指向类型的表达式,该类型指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义

也就是说

char * ptr = text;
和写作一样

char * ptr = &text[0];
也就是说

现在,当我们键入text C时,text变量没有自己的内存地址,将其解释为内存地址0101


不,这是错误的。变量text有一个地址try do&text,它将是char*[4]类型。现在,由于数组是连续内存位置中相同对象成员对象类型的集合,因此数组的地址是数组第一个元素的地址,因此在打印数组地址时,数组的第一个元素的地址将是相同的-但是请记住,它们的类型确实不同。

首先,这是一个声明

char[] text = "Hey";
不是有效的C结构。:您的意思是

char text[] = "Hey";
数组类型和指针类型是两种不同的类型。考虑下面的演示程序。

#include <stdio.h>

int main(void) 
{
    char text[] = "Hello World!";
    char *ptr   = "Hello World!";
    
    printf( "sizeof( text ) = %zu\n", sizeof( text ) );
    printf( "sizeof( ptr ) = %zu\n", sizeof( ptr ) );
    
    return 0;
}
或者,如果将运算符&的地址应用于变量text,如&text,则表达式的类型将为char*[13]。将运算符应用于变量ptr(如&ptr)时,表达式的类型将为char**

事实上,根据C标准,除了上面提到的表达式外,数组指示符在表达式中被隐式转换为指向其第一个元素的指针

所以你可以写

char text[] = "Hey";
char *ptr = text;
表达式&text和ptr的值虽然有不同的类型,但将是相等的,因为它们都指向数组占用的内存范围的初始地址

数组指示符转换为指向其第一个元素的指针这一事实与编译器如何将具有数组类型的函数参数调整为指向数组元素类型的指针类型有关。例如,这两个函数声明声明同一个函数

void f( char s[] );


首先,这是一份声明

char[] text = "Hey";
不是有效的C结构。:您的意思是

char text[] = "Hey";
数组类型和指针类型是两种不同的类型。考虑下面的演示程序。

#include <stdio.h>

int main(void) 
{
    char text[] = "Hello World!";
    char *ptr   = "Hello World!";
    
    printf( "sizeof( text ) = %zu\n", sizeof( text ) );
    printf( "sizeof( ptr ) = %zu\n", sizeof( ptr ) );
    
    return 0;
}
或者,如果将运算符&的地址应用于变量text,如&text,则表达式的类型将为char*[13]。将运算符应用于变量ptr(如&ptr)时,表达式的类型将为char**

实际上,根据C标准,数组指示符在expr中被隐式转换 除了上面提到的表达式之外,其他表达式都指向指向其firs元素的指针

所以你可以写

char text[] = "Hey";
char *ptr = text;
表达式&text和ptr的值虽然有不同的类型,但将是相等的,因为它们都指向数组占用的内存范围的初始地址

数组指示符转换为指向其第一个元素的指针这一事实与编译器如何将具有数组类型的函数参数调整为指向数组元素类型的指针类型有关。例如,这两个函数声明声明同一个函数

void f( char s[] );


您可能会喜欢。文本的第6部分是从地址0101开始的4字节区域。。。在许多情况下,它被转换。有人说它会衰减为指向地址0101的指针。有两种不同的东西:值变量和地址。指针将包含值变量的地址[但它也有自己的地址],而textfirst数组元素包含值,但可以作为指针==地址引用。当您将文本作为地址引用时,就像执行“intx;”&x’。x是变量,将引用该值,&x将引用其地址。”&x'=='text',x'==''*text'数组有一个地址。该地址始终是数组第一个元素的地址。指针包含一个地址。该地址可以指向任何地方,也可能无效。您可能喜欢。文本的第6节是从地址0101开始的4字节区域。。。在许多情况下,它被转换。有人说它会衰减为指向地址0101的指针。有两种不同的东西:值变量和地址。指针将包含值变量的地址[但它也有自己的地址],而textfirst数组元素包含值,但可以作为指针==地址引用。当您将文本作为地址引用时,就像执行“intx;”&x’。x是变量,将引用该值,&x将引用其地址。”&x'=='text',x'==''*text'数组有一个地址。该地址始终是数组第一个元素的地址。指针包含一个地址。该地址可以指向任何地方,也可能无效。