建行的官方网站网站规划与设计
提示:关于指针
文章目录
- 前言
- 一、指针的使用
- 总结
前言
在看c++书籍的时候,看到浅复制和深复制时,说到成员为指针的时候,会出异常。但是其实没有更多的感想,但是联想到上次考试指针没分配空间导致程序异常的情况,所以现在再验证一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、指针的使用
以下是验证代码。
int main()
{//这边是异常的,因为没有给指针分配空间,这个上次考试的时候,也遇到了,不过通过调试发现了改了。当时真是醍醐灌顶,切记。char *p = NULL;char str[] = "hello";memcpy(p, str, strlen(str));printf("%s",p);//这边是异常的,因为没有给指针分配空间int *p2 = NULL;int data = 12;*p2 = data;printf("%d",*p2);//打印12//这个是正常的,跟预想的不一样。int *p3 = NULL;int data3 = 12;p3 = &data3; //这边p指向了data的数据空间 p也就是被分配了空间printf("第一次打印p3:%d\n",*p3);int dataTest = 22;*p3 = dataTest;printf("第二次打印p3:%d\n",*p3);printf("打印data3:%d\n",data3); //这里注意data3的值也被改了return 0;
}
感想:其实里面涉及到一个问题,就是空指针不能解引用。
另外空指针可以被另一个指针赋值,即指针指向另一个内存空间。
为了深入了解一下指针的使用百度了一些资料如下
指针与内存
在C++中,一个指针必须在被分配内存之后,才能进行直接赋值的操作,如果没有进行内存的分配,直接对指针进行赋值,是会编译错误的,例如:int *p=123; //这样是不可取的
我们平时常用的分配内存方式是分配【栈内存】,例如:
int k=123; int *p=&k; *p=345; cout<<k;
因为123被放入了一个变量k中,系统为变量k分配了内存,指针p指向一个有内存空间的地址之后,就可以直接进行赋值了.
动态分配内存:
在系统中除了分配【栈内存】的方式外,还可以分配【堆内存】,分配方式如下:int *p=NULL; p=new int; //分配堆内存 *p=123; //分配了内存之后,就可以直接进行赋值操作了
关于指针赋值给指针
在C语言中,可以使用指针赋值运算符(=)将一个指针的值赋给另一个指针。指针之间的赋值实际上是将一个指针变量的值(即内存地址)赋给另一个指针变量。例如,假设有两个指针变量ptr1和ptr2,可以通过以下方式将ptr1的值赋给ptr2:```cptr2 = ptr1;```此时,ptr2将指向与ptr1相同的内存地址。需要注意的是,指针之间的赋值只是将内存地址赋给了另一个指针变量,而不是复制指针指向的内容。因此,修改其中一个指针指向的内存中的值也会影响另一个指针。```cint a = 10;int* ptr1 = &a;int* ptr2;ptr2 = ptr1; // 将ptr1的值赋给ptr2*ptr2 = 20; // 修改ptr2指向的内存中的值printf("%d", *ptr1); // 输出20,因为ptr1和ptr2都指向同一块内存```
欢迎补充。
总结
所以,根据以上验证,得出一个结论,就是浅拷贝的主要问题就是导致两个指针指向同一块内存,存在潜在的风险!