一、测试输出
%p 是输出指针变量的值,即地址值,以16进制形式输出
%d 是输出指针变量的值,是将16进制的地址值转换为10进制然后输出
#include<stdio.h>
#include<string.h>
int main()
{
int a = 1;
int *ptr_a = &a;
int *x = &ptr_a;
printf("a=%d\n",a);//
printf("a=%p\n",&a);//a的地址
printf("a=%08X\n",&a);//a的地址(输出8位)
printf("\n");
printf("ptr_a=%d\n",ptr_a);//输出地址值(%d 表示的是以10进制输出)
printf("ptr_a=%p\n",ptr_a);//输出地址值(默认的16进制形式)
printf("&ptr_a=%p\n",&ptr_a);//输出ptr_a的地址
printf("x=%p\n",x);//利用x变量存储 ptr_a的地址 然后输出
return 0;
}
二、%p解释
在 C 语言中,%p
是 printf
函数族中的一个格式说明符,用于打印指针的值。当使用 %p
时,printf
会将指针值转换为一种可读的形式,通常是十六进制表示法,并打印出来。
int main() {
int var = 10;
int *ptr = &var;
printf("Address of var: %p\n", &var);
printf("Value of ptr: %p\n", ptr);
return 0;
}
//输出结果
Address of var: 0x7ff7bfeff8ac
Value of ptr: 0x7ff7bfeff8ac
这里的 0x
前缀表示随后的数字是十六进制的。%p
格式说明符可以用于任何类型的指针,而不仅仅是 int
指针。
需要注意的是,指针的打印结果可能与机器和编译器有关,不同的环境可能会有不同的表现形式。此外,由于 %p
用于打印指针,因此它不适用于非指针类型的数据,否则可能会导致未定义的行为。
三、指针与地址之间的关系是什么?
-
地址:
- 地址是一个内存位置的编号,用于在内存中唯一标识每个字节。
- 地址通常以十六进制的形式表示,例如
0x12345678
。 - 每个变量在内存中都有一个地址,这是编译器分配给变量的。
-
指针:
- 指针是一个变量,它存储了另一个变量的地址。
- 指针的类型决定了它指向的地址中数据的类型和大小。
- 指针可以通过解引用操作(使用
*
运算符)来访问或修改它所指向的地址中的数据。
-
关系:
- 指针的值就是地址。当你创建一个指针并让它指向一个变量时,你实际上是在让这个指针存储那个变量的地址。
- 通过指针,你可以间接地访问和操作内存中的数据,而不需要直接使用数据的地址。
int var = 10; // 创建一个整型变量 var 并初始化为 10
int *ptr = &var; // 创建一个整型指针 ptr 并让它指向 var 的地址
printf("地址 of var: %p\n", &var); // 打印 var 的地址
printf("值 of ptr: %p\n", ptr); // 打印指针 ptr 的值(即 var 的地址)
printf("通过指针访问的值: %d\n", *ptr); // 通过指针 ptr 访问 var 的值
//运行之后
地址 of var: 0x7ff7bfeff8ac
值 of ptr: 0x7ff7bfeff8ac
通过指针访问的值: 10
总结来说,指针与地址之间的关系是,指针是一个用于存储和管理地址的变量,它使得程序员能够通过间接的方式来访问和操作内存中的数据。
四、int *ptr = &var; 和“int *ptr; ptr = &var;”这俩种有什么区别
在 C 语言中,int *ptr = &var;
和 int *ptr; ptr = &var;
这两种方式在功能上是相同的,都用于声明一个指向 int
类型变量的指针 ptr
,并将其初始化为变量 var
的地址。然而,它们在语法和初始化的时机上有所不同:
-
int *ptr = &var;
:- 这是一条复合声明语句,它同时完成了两件事:声明一个
int
类型的指针ptr
和将ptr
初始化为var
的地址。 - 在这个语句中,
ptr
被立即初始化。
- 这是一条复合声明语句,它同时完成了两件事:声明一个
-
int *ptr; ptr = &var;
:- 这是由两条语句组成的:第一条语句声明了一个
int
类型的指针ptr
,但没有初始化它。 - 第二条语句将
ptr
分配给var
的地址,从而初始化ptr
。 - 在这两条语句之间,
ptr
可能处于未定义的状态,这意味着它的值是未知的,直到它被显式初始化。
- 这是由两条语句组成的:第一条语句声明了一个
int var = 10;
int *ptr = &var; // 声明并立即初始化
// 或者分开写
int *ptr;
ptr = &var; // 先声明,然后初始化
在这两种情况下,ptr
都将指向 var
的地址,并且可以通过 ptr
访问或修改 var
的值。