当前位置:首页 > C++对象模型[2]指针与引用
[C++对象模型][2]指针与引用 一 概括
指针和引用,在C++的软件开发中非常常见,如果能恰当的使用它们能够极大的提高整个软件的效率,但是很多的C++学习者对它们的各种使用情况并不是都了解,这就导致了实际的软件开发中经常会内存泄漏,异常抛出,程序崩溃等问题。对于C和C++的初学者,那更是被它们搞的迷迷糊糊。本篇作为[深入C++]系列的第一节,我们就带领大家把指针和引用这个基本功练好。 二 指针
指针,指针的定义是什么呢?好像要想给个直接的定义还是很难的哦,所以我们这里用它的语法结合图来认识它。 int i = 10; int *p = NULL; p = &i;
int j = *p;
int **pP = NULL; pP = &p;
在上面的几条语句中,&用来定义引用变量或对变量取其地址,*用来定义指针或得到指针所指向的变量,其中p为定义的指针变量,它指向int变量i,而pP为二级指针变量,它指向指针变量p。相应的示意图如下:
C++是对C的扩展,我们首先来看指针在C中的使用,下面的经典实例来自林锐的《高质量编程》,记住函数的默认参数传递方式为按值传递,即实参被传入函数内时进行了拷贝,函数内其实是对拷贝对象的操作,还有当函数使用return返回变量时,其实返回的是原对象的一个拷贝,此时的实参和原对象有可能是一般变量也有可能是指针变量。
Code
#pragma once
#include
// ----------------------------------------------- void GetMemory1(char *p, int num) {
p = (char*)malloc(num); }
void Test1(void) {
char *str = NULL; GetMemory1(str, 100);
strcpy(str, \ printf(str); }
// ----------------------------------------------- void GetMemory2(char **p, int num) {
*p = (char*)malloc(num); }
void Test2(void) {
char * str = NULL; GetMemory2(&str, 100);
strcpy(str, \ printf(str); free(str); }
// ----------------------------------------------- char* GetMemory3(void) {
char p[] =\ return p; }
void Test3(void) {
char* str = NULL; str = GetMemory3(); printf(str); }
// ----------------------------------------------- char* GetMemory4(void) {
char *p = \ return p; }
void Test4() {
char* str = NULL; str = GetMemory4(); printf(str); }
// ----------------------------------------------- char* GetMemory5(void) {
char *p = (char*)malloc(100); strcpy(p,\ return p; }
void Test5() {
char* str = NULL; str = GetMemory5(); printf(str); free(str); }
// ----------------------------------------------- void Test6( void ) {
char * str = (char*)malloc(100); strcpy(str, \ free(str);
if (str != NULL) {
strcpy(str, \ printf(str); } }
// ----------------------------------------------- void TestPointerAndReference() {
// -----------------------------------------------
// 请问运行Test1函数会有什么样的结果? //
// 答:程序崩溃。同时有内存泄漏。 //
// 因为在GetMemory1函数的调用过程中,其实是对实参指针p做了拷贝,拷贝为局部变量,
// 在函数内的操作是对局部变量的操作,局部变量与实参是两个不同的变量,相互不影响。 //
// 所以,当GetMemory1调用结束时,Test1函数中的 str一直都是 NULL。 // strcpy(str, \将使程序崩溃。 //
//Test1();
// ----------------------------------------------- // 请问运行Test2函数会有什么样的结果? //
// 答:(1)能够输出hello world; (2)但是调用结束要对内存释放,否则内存泄漏; //
Test2();
// ----------------------------------------------- // 请问运行Test3函数会有什么样的结果? //
// 答:可能是乱码。 //
// 因为GetMemory3返回的是指向“栈内存”的指针,
// 该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。 //
Test3();
// ----------------------------------------------- // 请问运行Test4函数会有什么样的结果? //
// 答:(1)能够输出hello world; (2) 此时的str指向了常量区,不需要程序员释放,程序结束自动释放。 //
Test4();
// ----------------------------------------------- // 请问运行Test5函数会有什么样的结果? //
// 答:(1)能够输出hello world; (2)但是调用结束要对内存释放,否则内存泄漏;
共分享92篇相关文档