我们为什么要这样做:
char* array = "String";
但不是
int* array = 1;
据我所知*表示地址,所以我真的不明白为什么我们可以给出非地址值,比如“String”。到char *数组。
答案 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";
}
}
不起作用,因为您尝试将整数分配给指向整数的指针。类型不同