为什么这两个局部变量的地址相同?

Mor*_* Rg 1 c c++ arrays printf pointers

我在这里定义了一个函数,它接受数组作为参数

void print(char ch[]);
Run Code Online (Sandbox Code Playgroud)

当我调用该函数并将数组作为参数提供给它时

int main(){
    char ch[10];
    print(ch);
 }
Run Code Online (Sandbox Code Playgroud)

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

 #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;
}
Run Code Online (Sandbox Code Playgroud)

main函数中数组的地址和我定义的函数中作为参数的数组地址肯定不一样,但是是一样的。为什么?

运行此代码的结果

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

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

eer*_*ika 5

char ch[10];
Run Code Online (Sandbox Code Playgroud)

该变量是一个数组。它隐式转换为指向第一个元素的指针。指针的值是它指向的对象的地址,该地址是您看到的输出1

void print(char ch[]) {
Run Code Online (Sandbox Code Playgroud)

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

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

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


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