查看内存分配的程序
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",p);
}
有什么区别
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",&p);
}
查看内存分配的程序
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",p);
}
有什么区别
#include<stdio.h>
main()
{
char *p;
printf("the address of p is = %u\n",&p);
}
第一个程序打印解释为无符号整数的未初始化指针 p 的值。由于指针未初始化,因此打印的值是该位置发生的任何值。第二个程序打印指针 p 的地址,该地址被解释为无符号整数。虽然在技术上不合法,但它适用于 sizeof(char *) == sizeof(unsigned int) 的大多数系统。由于变量“p”是一个自动变量,您将在运行时分配给 C 堆栈的地址范围内获得一个值。
编辑:从评论中澄清。Printf 根据控制字符串格式化参数中传递给它的数据。%u 表示打印一个无符号整数。所以当你通过p
, C 将指针变量的值传递给 printf。传入的字节数取决于该平台的 sizeof(pointer)。printf 通常仅在控制字符串后作为参数传入的数据类型与控制字符串中的所有 % 指令匹配时才“起作用”。但是在 sizeof(onetype) == sizeof(another-type) 的情况下,我写的是正确的:printf 会将特定参数位置中的位解释为控制字符串中相应位置中指定的类型。在 sizeof(pointer) == sizeof(unsigned int) 的地方,你将得到的是指针的值打印为 unsigned int。
第一个程序由于未定义的行为使用未初始化的自动变量 (p) 和使用与参数不匹配的 printf 格式说明符(无符号整数与指向对象的指针)打印垃圾。第二个打印 p 的地址(但在技术上也会调用未定义的行为)。
您将指针变量分配在一个内存地址,而它指向的变量指向另一个内存地址。
+---+ +-------------------+
| p | -------------> | variable |
+---+ +-------------------+
Address: 0xBBBBBBBB Address: 0xAAAAAAAA
你可以有这样的代码:
int a = 5;
int* p = &a; // p, located at 0xBBBBBBBB will point to a, located at 0xAAAAAAAA
打印变量的地址只会返回 0x(stuff)。
& <变量> = 你的变量所在的地址,无论是变量还是指针(它自己是一个变量)