[英]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.