(C指针深刻理解)strcpy函数和指针赋值操作的差别

离上次更新也快一个月了,这1个月时间一直在学C语言。自己定个小目标,以后能每周写一次博客。分享我在学习过程遇到的问题,如果你有同样的问题,我能够帮助你理解和解决,我感到十分开心。记住,一定要理解代码的原理,这样才是有效的学习

前言:

本篇博客是指针的相关问题,关于指针,学习了一个半月时间了,我认为指针最重要的问题是:

1.指针究竟指向的是谁(指向的地址到底是什么)?

2.指针指向的地址的值有没有发生改变?

带着这两个问题对学习指针,我认为有很大帮助。

情景:

若你碰到以下代码情况,需要用pt1(字符指针)暂时指代pt2(malloc)的内容,指代之后,如何更改pt2的值呢?你想到可以这样做

1.pt2指针直接赋值操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char* pstr = "阿狗"; //pt2想指代的变量
	char* pt1; //pt2暂时变量
	char* pt2 = (char*)malloc(10 * sizeof(char));
	strcpy(pt2, "阿猫"); //pt2原本的内容
	pt1 = pt2; //pt1暂时指代pt2本身的内容
	pt2 = pstr; //更改pt2指针的内容
	printf("%s", pt1);
}

2.strcpy函数修改指针内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char* pstr = "阿狗";
	char* pt1;
	char* pt2 = (char*)malloc(10 * sizeof(char));
	strcpy(pt2, "阿猫");
	pt1 = pt2;
	strcpy(pt2, "阿狗");  //直接strcpy修改pt2
	printf("%s", pt1);
}

运行后发现,上述打印pt1的内容居然不一样,第一个案例的代码符合我们预期打印了pt2原本的的内容阿猫。而第二个案例代码与我们预期完全不同,打印了阿狗,也就是pt1指向了阿狗的内容,跟着pt2一起被修改了,这是为什么呢?首先要问自己,pt1究竟指向的是谁?pt1所指的地址的值有没有发生改变

思考:

pt1究竟指向的是谁?

指针之间的赋值是改变指针的所指的地址,pt1所指的是pt2,pt2指向的是malloc创建的地址,因此pt1所指的是malloc的那片地址——阿猫。而在第一个案例中,pt2=pstr,也就是说pt2所指引的地址改变了,pt2所指的是pstr也就是阿狗pt2指针指向变化,pt1并不会跟着pt2变化,pt1指的不是pt2,而是malloc的地址——阿猫。只要malloc这个创建地址的值不会变,pt1的解引用值就不会变。

pt1指向地址的值有没有改变?

第二个案例打印的却是pt2的新值——阿狗。通过上述指向分析,我们知道pt1指引的是malloc分配的那片内存——阿猫。但为什么pt1会发生变化呢?strcpy函数是在指针的地址上对值进行修改,也就是说malloc的那片内存地址——阿猫,发生了变化,被strcpy修改成阿狗了。而pt1所指引的正是那片内存地址,因此也被修改成阿狗,所以打印了阿狗。

回顾

通过上述比较,我们可以得出结论,指针赋值操作是是改变指针的指向,但是原地址的阿猫不会发生变化;而strcpy函数是在所给的地址基础上进行修改,阿猫被修改成了阿狗,因此有了两种不同的结果

如果我的这篇博客对你有帮助,不妨点个赞再走嘿嘿嘿。

猜你喜欢

转载自blog.csdn.net/DADONGOOO/article/details/127726391
今日推荐