繁体   English   中英

为什么这两个局部变量的地址是一样的?

[英]Why are the addresses of these two local variables the same?

我在这里定义了一个接受数组作为参数的 function

void print(char ch[]);

当我调用 function 并将数组作为参数

int main(){
    char ch[10];
    print(ch);
 }

我在两个不同的函数中打印这两个变量的地址,

 #include <stdio.h>
 
 void print(char ch[]) {
      printf("address of ch is %d\n",ch);
      
}

int main() {
     char ch[10];
     print(ch);
     printf("address of ch is %d\n",ch);
     return 0;
}

主function中的数组地址必须和我定义的function中作为参数的数组地址不同,但是是一样的。 为什么?

运行此代码的结果

变量的地址是否可以为负?

感谢您花时间阅读这个问题。

 char ch[10];

这个变量是一个数组。 它隐式转换为指向第一个元素的指针。 指针的值是它所指向的 object 的地址,而那个地址就是你看到的 output 1

 void print(char ch[]) {

这个参数是一个指针。 它可能看起来像一个数组,但数组参数被调整为指向数组元素的指针。 当你 output 指针的值时,你看到指向的地址是 object; 不是存储指针的变量的地址。

由于您作为参数传递的指针指向本地数组的第一个元素,因此您看到的地址1是相同的。

变量有不同的地址,但参数变量的值与数组变量的第一个元素的地址相同。


1除了,您使用了与参数类型不匹配的错误格式说明符,因此程序的行为实际上是未定义的。 不要这样做。 如果您绝对必须使用printf ,那么您必须使用%p格式说明符并将参数转换为void*

没错,两个不同的 arrays 不能有相同的地址。

char ch[]虽然不是数组。 尝试将数组用作 function 参数会默默地创建一个指针,因此在这种情况下它意味着char *ch (但char ch[10]; in main仍然是一个数组,因为它不是参数。)

ch (当应用于char ch[]参数时)不是ch的地址。 这是ch指向的地址。 &ch将是ch本身的地址,并且它将具有不同的值。

但是对于main中的char ch[10] ,由于它是一个数组,因此ch&ch具有相同的值(但类型不同: char * vs char (*)[10] (指向 10 个字符的数组的指针))。

对于 output 的初学者,您需要使用转换说明符%p而不是转换说明符%d的指针。 否则printf的调用会调用未定义的行为。

printf("address of ch is %p\n", ( void * )ch);

其次,在 function 中,对printf的调用不会 output 变量ch本身的地址。 它输出指针表达式ch指向的数组的第一个元素的地址。 由于数组未在 memory 内移动,因此您将获得相同的地址值。

到 output 的地址 function 参数你需要写

void print(char ch[]) {
      printf("address of ch is %p\n", ( void * )&ch);
}

在此通话中注意这一点

print(ch);

该数组被隐式转换为指向其第一个元素的指针。 并且编译器将具有数组类型的function参数调整为指向数组元素类型的指针

void print(char *ch) {

printf这两个调用在声明源数组的 main 和 function 中存在差异

printf("address of ch is %p\n", ( void * )ch);
printf("address of ch is %p\n", ( void * )&ch);

在 function 中,第一次调用输出指针ch指向的数组的第一个元素的地址,即该数组占用的 memory 的范围的地址。

第二个调用输出具有char *类型的局部变量ch本身的地址(如上所述)。

这些调用主要输出与数组占用的 memory 范围的地址相同的值。 第一次调用输出数组第一个元素的地址,第二次调用输出整个数组的地址 object。 这两个值都是数组占用的memory的extent的起始地址。

与原始类型相反,arrays 总是通过地址(作为指针)传递给函数,即使你没有明确地这样做。 因此,function scope 内部的数组地址将与 scope 外部的地址相同。

为什么这两个局部变量的地址是一样的?

C 样式数组传递给 function 实际上将其指针传递给 function,而不是整个数组。 这个void print(char ch[]); void print(char* ch);相同所以这两个函数都在main function ( char ch[10]; ) 中打印相同数组的地址。

如果要将数组的副本传递给 function,可以使用std::array如下:

#include <cstdio>
#include <array>


template<std::size_t N>
void print(std::array<char, N> ch) {
      printf("address of ch is %d\n", ch.data());
}

int main() {
    std::array<char, 10> ch;
    print(ch);
    printf("address of ch is %d\n", ch.data());
    return 0;
}

现在地址将不一样了。

变量的地址是否可以为负?

这里:

printf("address of ch is %d\n",ch);

上面的语句将ch (指针)解释为十进制值(因为'%d' )。 这就是为什么你看到一个负数。 您需要改用%p

void print(char ch[]) {
      printf("address of ch is %p\n", (void*) &ch);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM