c++中*p=a和p=&a的区别

本文通过实例讲解了指针的基础概念及应用,包括一级指针、二级指针、数组指针、指针数组等,并通过对比*p=a与p=&a阐述了它们的区别。

大学初学指针的时候,时常懵逼,有时候觉得自己已经掌握了,但是一看复杂的程序和源码里的指针用法,就又蒙了,以至于谈指针色变。至于二级指针,数组指针、指针数组、函数指针什么的更是被吓懵。现在来逐个击破他们,为我们的编程道路扫清阻碍。

首先需要明白一点的是,指针是个变量,它和int类型、float类型等的变量一样,也存储在内存中,占据一定的字节。只是int变量存储的是整形数字,而指针变量存储的是地址,掌握了这点,攻破指针就指日可待了。

假设存在一个int类型的变量a,一个指向int类型的指针p。

现在来*p=a和p=&a的区别。先分析*p=a,这是一个赋值操作。这里可以把*p当成另外一个int b变量。b=a,是不是就很熟悉了。所以*p=a表示把a的值赋值给p所指向(存储)的内存地址。

再分析p=&a。这里就很好理解了,把a的地址,赋值给p。即p指向(存储)了a的地址。

结合实际例子分析:

运行环境:VS2013,语言:C++。

#include <iostream>
 
using namespace std;
 
int main()
{
	int a = 2;
	int *p = &a;
	printf("%d\n", *p);

	int *PA = new int;
	cout << "PA 地址=" << PA << endl;
	*PA = a;
	cout << "*PA=" << *PA << endl;
	cout << "PA 地址=" << PA << endl;	//地址不变

	cout << "------------我是分割线------------" << endl;

	int *PB = NULL;
	/*如果使用PB = &a后,对PB进行delete会报错,
	因为PB已经指向a的地址,对a进行delete操作,是不行的。
	但是不delete又会内存泄漏,所以用空指针指向a。
	*/
	//int *PB = new int; 
	cout << "PB 地址=" << PB << endl;	
	PB = &a;
	cout << "*PB=" << *PB << endl;
	cout << "PB 地址=" << PB << endl;	//地址变了

	delete PA;     //记得用delete释放指针PA占用的内存 
	PA = NULL;     //然后使指针指向空

	//delete PB;		
	//PB = NULL;

	getchar();
 

    return 0;
}

输出:

二者区别:

*PA=a;     表示把a的值赋值给PA所指的内存地址,PA本身没变。

PB=&a;    表示指针PB指向变量a的地址,PB本身变了。

在 C 或者 C++ 编程语言中,`*p = a;` `*p = &amp;a;` 这两个表达式是有本质区别的,下面我们详细解释一下: ### 1. **`*p = a;`** - 假设我们有一个指针变量 `p` 并且它已经指向了一个有效的存储地址。 - 表达式的含义是对指针所指向的内容赋值为 `a` 的值。 - 换句话说,这个操作会修改由指针 `p` 所指向内存位置的数据。 #### 示例代码: ```c int a = 5; int b = 0; int *p = &amp;b; *p = a; // 将 "a" 中的值 (5) 赋给 p 所指向的位置(即变量 b) printf("%d\n", b); // 输出结果应该是 5 ``` --- ### 2. **`*p = &amp;a;`** - 此处存在语法错误,在标准C/C++里无法直接通过这种方式将一个地址(&amp;a)赋予到一个非指针类型的间接引用(*p),除非有特别转换或设计情况允许这种隐含操作。 如果希望让某个指针指向另一个对象,则应写成类似形式如 `p = &amp;a;`(即将指针本身重新定向至新目标),而非试图解引用后再处理右端项作为地址来源。 #### 错误示例尝试解析: 假设下面代码企图实现某些特殊功能却导致编译失败: ```c int a = 5; int c = 0; int *p = &amp;c; // 下面这行会产生错误因为不能把地址&amp;直接存放到普通数据空间内 *p = &amp;a; ``` 这里的问题在于左侧是一个整数性质区域期待数值填充而不是物理位址注入故违反类型规则 因此正常应该如此修正: ```c p = &amp;a;//正确的做法是指明当前P转向A所在的那块地方去记录其实际内容变化而已! ``` --- 总结来说,“\*p=a”代表改变指定单元格里的信息量而“\*p=&amp;a”则因违背基础类别匹配准则所以一般不会成立需要调整思路改为单纯转移链接关系即可完成预期任务目标。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值