C和C++中解地址*和取地址&运算符的用法和区别

文章详细阐述了C语言中函数传值特性,以及如何通过指针和指针的指针来改变函数外部变量的值。同时对比了C++中的引用,说明引用作为函数参数时如何直接操作原变量。并通过示例代码解释了指针地址、解引用及NULL赋值等概念。
摘要由CSDN通过智能技术生成

情况一:

#include<stdio.h>
void modify(int *p){
	p = NULL;
}
int main(){
	int x = 10;
	int *p = &x;
	
	printf("%d\n",*p);//10
	modify(p); 
	printf("%d\n",*p);//10
	
	
} 

C语言中函数是传值的,在这个modify函数中,传入的是p指针的副本,在函数内部修改的p指针在外部不体现,如果要修改指针p指向的值,应该用指针的指针,因为p也是一个变量

情况二:

#include<stdio.h>
void modify(int **p){
	*p = NULL;
}
int main(){
	int x = 10;
	int *p = &x;
	
	printf("%d\n",*p);//10
	modify(&p); 
	printf("%d\n",*p);//报错,因为现在指向的NULL这个地址没有存变量
	
	
} 

这里modify传入的是*p的指针**p,也就是指向指针p的指针,在函数内部修改的是指针p的值,也就是说修改的是指针p指向的地址,原来指向的是x的地址,现在修改成指NULL的地址
*p是一个变量,而变量的指针指向的是变量的地址

情况三:

#include<iostream>
using namespace std;
void modify(int& p){
	p = 20;
} 
int main(){
	int x = 10;
	printf("%d\n",x);
	modify(x);
	printf("%d\n",x);
}

这是C++的代码,上面的两个都是C语言代码。
&在C++中除了取变量的地址int *p = &x外,还有一个作用是引用地址,在上面的代码中,函数的参数是int& p它表示p的地址的引用,可以理解为它是x的别名,本质上是一个变量,也就是说在函数内部对p的操作就是在对x的操作,这不是副本,和传值是不一样的

情况四

#include<iostream>
using namespace std;
int main(){
	int x = 10;
	int* px = &x;  // px 是 x 的地址
	int y = *&x;  // y 的值等于 x 的值


}
void modify(int*& p) {
    p = nullptr;  // 修改 p 的值
}

int main() {
    int x = 10;
    int* p = &x;
    modify(p);
    // 现在,p 的值是 nullptr
}

情况五

int main(){
	int x = 10;
	int* p = &x;
	//以下三个输出均是x的地址
	printf("&x = %d\n",&x);
	printf("p = %d\n",p);
	printf("&*p = %d\n",&*p);//*p就是x
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,解引用是一种操作符`*`,用于访问指针指向的数据。当我们声明一个指针变量并为其分配地址后,通过使用解引用运算符`*`,我们可以访问到该指针所指向的内存位置上的数据。 下面是一些关于如何在C语言中使用解引用的例子: ### 示例代码 ```c #include <stdio.h> int main() { int num = 42; // 定义整型变量num,并赋值为42 int *ptr_num = &num; // 定义一个整型指针ptr_num,并将其初始化为指向num的地址 printf("直接访问 num 的值:%d\n", num); // 输出原始值:42 printf("通过指针 ptr_num 访问 num 的值:%d\n", *ptr_num); // 输出通过指针访问的值:42 return 0; } ``` ### 解释 1. **定义整型变量 `num` 并赋予初始值**:`int num = 42;` 2. **定义指针 `ptr_num` 并将它指向 `num`**:`int *ptr_num = &num;` - `&num` 表示变量 `num` 的地址,这使得 `ptr_num` 可以作为一个指向 `num` 内存地址的指针。 3. **使用解引用访问数据**:`*ptr_num` 意味着从 `ptr_num` 获的值作为访问当前指向的内存地址的内容。 - 这意味着,当你有 `int x = 5; int *p = &x;` 时,`*p` 将会得到内存地址 `x` 所存储的值即 `5`。 ### 使用场景 - **动态内存管理**:当需要在运行时创建、修改或释放数组或其他数据结构时,指针和解引用非常有用。 - **函数参数传递**:函数可以接受指针作为参数,允许函数内部修改实际的内存地址而不是局部变量副本。 - **链表和其他数据结构**:许多复杂的数据结构如链表、树等都依赖于指针和解引用来进行元素的查找、插入和删除。 ### 注意事项 - 确保在访问指针前检查它是否已经指向了有效的内存位置,避免访问未初始化或已自由化的内存,这是导致程序错误的主要原因之一。 - 遵循良好的编程实践,例如在访问指针前检查其是否非空(`if (ptr != NULL) { ... }`),并且始终记得在不再需要指针时释放它占用的内存资源(如果是在堆上动态分配的)。 ### 相关问题: 1. **如何安全地使用动态内存分配以及如何处理未初始化的指针?** 2. **解释一下为什么在某些场合下,使用引用而非指针可能会更优?** 3. **讨论指针算术运算如何在C语言中使用,并给出例子说明。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值