C语言指针

一、测试输出

%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 用于打印指针,因此它不适用于非指针类型的数据,否则可能会导致未定义的行为。

三、指针与地址之间的关系是什么?

  1. 地址

    • 地址是一个内存位置的编号,用于在内存中唯一标识每个字节。
    • 地址通常以十六进制的形式表示,例如 0x12345678
    • 每个变量在内存中都有一个地址,这是编译器分配给变量的。
  2. 指针

    • 指针是一个变量,它存储了另一个变量的地址。
    • 指针的类型决定了它指向的地址中数据的类型和大小。
    • 指针可以通过解引用操作(使用 * 运算符)来访问或修改它所指向的地址中的数据。
  3. 关系

    • 指针的值就是地址。当你创建一个指针并让它指向一个变量时,你实际上是在让这个指针存储那个变量的地址。
    • 通过指针,你可以间接地访问和操作内存中的数据,而不需要直接使用数据的地址。
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 的地址。然而,它们在语法和初始化的时机上有所不同:

  1. int *ptr = &var;

    • 这是一条复合声明语句,它同时完成了两件事:声明一个 int 类型的指针 ptr 和将 ptr 初始化为 var 的地址。
    • 在这个语句中,ptr 被立即初始化。
  2. int *ptr; ptr = &var;

    • 这是由两条语句组成的:第一条语句声明了一个 int 类型的指针 ptr,但没有初始化它。
    • 第二条语句将 ptr 分配给 var 的地址,从而初始化 ptr
    • 在这两条语句之间,ptr 可能处于未定义的状态,这意味着它的值是未知的,直到它被显式初始化。
int var = 10;
int *ptr = &var; // 声明并立即初始化

// 或者分开写
int *ptr;
ptr = &var; // 先声明,然后初始化

在这两种情况下,ptr 都将指向 var 的地址,并且可以通过 ptr 访问或修改 var 的值。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值