C ++数组查询

时间:2015-06-07 15:37:56

标签: c++ arrays pointers

我们为什么要这样做:

char* array = "String";

但不是

int* array = 1;

据我所知*表示地址,所以我真的不明白为什么我们可以给出非地址值,比如“String”。到char *数组。

5 个答案:

答案 0 :(得分:2)

char* array表示array是一个可以保存另一个对象(例如另一个变量或常量)的地址的变量。

如果程序有"String",则表示内存中实际存在7个字符的数组,并且它包含内容"String"

当您编写array = "String";时,变量array将保留该字符串中字母'S'的地址。

这是因为C ++有一个规则,有时称为数组指针衰减,这意味着如果您尝试在值为的上下文中使用数组(例如"String")预期,然后它会自动转换为指向该数组的第一个元素的指针。

如果没有这条规则,您必须写array = &("String"[0]);。该规则最初包含在C中,以避免在使用数组时必须在整个地方写&....[0],尽管事后看来它似乎产生了更多的痛苦而不是快乐。

转到int* i = 1。您已经说i可以保留int的地址,但您没有提供任何此类地址。变量不是数组不会自动转换为其地址。实际上1甚至不是一个变量。我们将其称为 prvalue ,它没有与之关联的任何内存存储区域,因此它没有地址。要指向1的实例,您必须创建一个变量,例如:

int j = 1; int* i = &j;

答案 1 :(得分:1)

*并不代表地址。它的含义是上下文敏感的,但大多数时候它意味着指针。

之所以不这样做是因为"String"是一个字符数组,或者是一个指向字符的指针。与此相反,1是不是有效地址的文字。您应该改为编写int array = 1,之后您可以int *brray = &array

答案 2 :(得分:0)

  

“我真的不明白为什么我们可以提供非地址值,例如"String."

那是因为字符串文字实际上是const char[]数组,当分配给char*时它会衰减到指针,而1不是一个而你不能接受它以任何方式解决。

答案 3 :(得分:0)

*表示指针,而不是地址。您可以使用&运算符检索地址。

char* array = "String";

实际上将array声明为指向字符的指针,声明后的=符号告诉编译器指针应该具有什么值。在这种情况下,它是运行程序内存中某个字符串池中"String"的地址。

int* array = 1;

没有像您预期的那样将1的地址设置为array。但是,稍作调整

int* array = (int*)1;

...它可能指向地址1的整数,遗憾的是这是不可访问的。

答案 4 :(得分:0)

这项任务:  Node
将“String”分配给内存中的可用位置,并返回内存中“String”的第一个位置的内存地址。 “array”存储“S”的地址。

这项任务: function service_dates() { $file_path .= "/dates.txt"; $handle = fopen($file_path, "r"); if ($handle) { while (($line = fgets($handle)) !== false) { $new_time = strtotime( $line ); $time_now = strtotime(date("d-m-Y", gmmktime())); if ($time_now == $new_time) { $next_date = date("D, jS M", $new_time); $status = "Operating a Service Today!"; $statusid = 1; $returnstatus = array($status, $next_date, $statusid); return $returnstatus; } if ($time_now <= $new_time) { $next_date = date("D, jS M", $new_time); $status = "Closed Today"; $statusid = 2; $returnstatus = array($status, $next_date, $statusid); return $returnstatus; } } fclose($handle); } else { echo "error"; } }
不起作用,因为您尝试将整数分配给指向整数的指针。类型不同