use*_*491 7 c arrays string pointers
请记住一个让我烦恼的问题.
我知道pointers,并arrays在C不同,因为pointers存储的address,而arrays商店'real' values.
但是当涉及到时我会感到困惑string.
char *string = "String";
Run Code Online (Sandbox Code Playgroud)
我读到这行做了几件事:
编译器创建一个字符数组,它具有值String.
然后,该数组被认为是a pointer,程序将指针分配给指针字符串,该指针指向first element编译器创建的数组.
这意味着,arrays被视为pointers.
那么,这个结论是真是假,为什么呢?
如果是假,什么是那么之间的差异pointers和arrays?谢谢.
甲指针包含一个对象的地址(或是不指向任何对象空指针).指针具有特定类型,指示它可以指向的对象类型.
一个阵列是元件的连续有序序列; 每个元素都是一个对象,并且数组的所有元素都是相同的类型.
甲串被定义为"由终止字符的连续序列,并且包括第一个空字符".C没有字符串类型.字符串是数据布局,而不是数据类型.
数组和指针之间的关系可能令人困惑.我所知道的最好的解释是comp.lang.c FAQ的第6节给出的.要记住的最重要的事情是数组不是指针.
在C和C++中,数组在某种意义上是"二等公民".它们不能被赋值,作为函数参数传递,或者进行相等性比较.操作数组的代码通常使用指向数组的各个元素的指针来执行此操作,并使用一些显式机制来指定数组的长度.
混淆的主要原因是数组类型的表达式(例如数组对象的名称)在大多数上下文中被隐式转换为指针值.转换后的指针指向数组的初始(第零个)元素.如果数组是以下情况,则不会发生此转换:
sizeof(sizeof array_object产生数组的大小,而不是指针的大小);&(&array_object作为整体产生数组对象的地址); 要么初始值设定项中的字符串文字,用于初始化数组对象.
char*string ="String";
为避免混淆,我将在您的示例中进行一些更改:
const char *ptr = "hello";
Run Code Online (Sandbox Code Playgroud)
字符串文字"hello"创建一个类型char[6](在C中)或const char[6](在C++中)包含字符的匿名对象{ 'h', 'e', 'l', 'l', 'o', '\0' }.
在此上下文中,对该表达式的求值产生指向该数组的初始字符的指针.这是一个指针值 ; 没有隐式创建的指针对象.该指针值用于初始化指针对象ptr.
任何时候都不会将数组"视为"指针.数组表达式转换为指针类型.
混淆的另一个原因是看起来是数组类型的函数参数实际上是指针类型; 在编译时调整类型.例如,这个:
void func(char param[10]);
Run Code Online (Sandbox Code Playgroud)
真正意思:
void func(char *param);
Run Code Online (Sandbox Code Playgroud)
这10是默默无视的.所以你可以这样写:
void print_string(char s[]) {
printf("The string is \"%s\"\n", s);
}
// ...
print_string("hello");
Run Code Online (Sandbox Code Playgroud)
这看起来就像操纵数组一样,但实际上数组"hello"被转换为指针,而指针就是传递给print_string函数的指针.
那么,这个结论是真的还是假的,为什么?
你的结论是错误的。
数组和指针是不同的。comp.lang.c FAQ list · 问题 6.8解释了数组和指针的区别:
数组是单个、预先分配的连续元素块(所有类型相同),大小和位置固定。指针是对任何地方的任何数据元素(特定类型)的引用。必须分配一个指针以指向在别处分配的空间,但它可以随时重新分配(如果从 malloc 派生的空间可以调整大小)。指针可以指向一个数组,并且可以模拟(连同 malloc)一个动态分配的数组,但指针是一种更通用的数据结构。
当你做
char *string = "String";
Run Code Online (Sandbox Code Playgroud)
当 C 编译器遇到这种情况时,它会7为字符串文字留出内存字节String。然后将指针设置为指向string所分配内存的起始位置。
当你声明
char string[] = "String";
Run Code Online (Sandbox Code Playgroud)
当 C 编译器遇到这种情况时,它会7为字符串文字留出内存字节String。然后给出该内存位置的名称,即第一个字节,string。
所以,
string是指针变量,第二种情况是数组名称。 这意味着数组在 C 中不被视为指针,但它们密切相关,因为指针算术和数组索引在 C 中是等效的,指针和数组是不同的。
我们可以创建一个名为“string”的数组
char string[] = "Hello";
Run Code Online (Sandbox Code Playgroud)
我们可以分配一个指向该字符串的指针
char* stringPtr = string;
Run Code Online (Sandbox Code Playgroud)
数组名转换为指针
因此,数组名称类似于指针。但是,它们并不相同,因为数组是连续的内存块,而指针仅引用内存中的单个位置(地址)。
char *string = "String";
Run Code Online (Sandbox Code Playgroud)
此声明创建数组并将指针的地址设置为用于存储数组的内存块。
这意味着,数组被视为指针。那么这个结论到底是真是假
错误,数组不是指针。然而,只是为了混淆(!),由于取消引用运算符 [],指针可能看起来是数组
char *string = "String";
char letter = string[2];
Run Code Online (Sandbox Code Playgroud)
在本例中string[2], string 首先被转换为指向数组第一个字符的指针,并使用指针算术,返回相关项。