C++学习 指针和引用

部分参考百度

================================指针==================================
指针可以初始化为0 如 int *p=0; 使之不至于成为失控指针

数据在内存中的存放方式:

栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值 连续的内存空间

堆区(heap):由程序员分配释放  不连续的内存空间 由链表串联起来

寄存器区:用来保存栈顶指针和指令指针

全局区(静态区):全局变量和静态变量的存储时放在一起的,初始化的全局变量和静态变量
在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束由系统释放。

文字常量区:常量字符串存放位置,程序结束后由系统释放

程序代码区:存放函数体的二进制码

C++使用关键字 new 创建一个堆,并分配内存
使用 new 创建的内存空间不会被系统自动释放
必须在使用 delete 释放该指针所指向的内存 但是这不会释放指针,因此还可以再次使用该指针

(不要重复删除,会是程序崩溃,删除空指针是安全的)
当用 delete 释放一个指针所指向的空间后。最好将该指针中保存的内存地址清0,以免重复操作该地址,
导致错误。

常量指针:
#include<iostream>
using namespace std;
class A
{
public:
	int getValue(){ return x;}
	void setValue(int para){x = para;}

private:
	int x;
};
int main(void)
{
	A *a = new A;
	cout<<a<<endl;    0x30F98
	cout<<a+1<<endl;  0x30F9c 

	A *p = new A;

	p->setValue(11);
	cout<<p->getValue()<<endl;

	return 0;
}
【辨析:常量指针 与 指针常量】
常量指针与指针常量是C语言中两个比较容易混淆的概念:
(1) const char* p;
(2) char* const p=a;
(3) char* p="abc";

(1)式定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,
但指针本身可以修改,即*p='b',是非法的,*p是p指向的常量的第一个字符,是个常量,不能改变的。
p=&q这是可以的,指针可以指向不同的地址

int a,b;
const int *p = &a;//常量指针    *p不可修改 *p = 8;(ERROR)
                                  p 可以修改 p = &b  (OK)

(2)式定义了一个指针常量,即指针本身是个常量,不可修改,但指针指向的内容可以修改,一开始定义时让它指向数组a. 
*p='b'这是可以的,但p=&b是非法的。

int a;
int * const p = &a    //指针常量  *p可以修改*p = 8;(OK)
                                   p不可以修改 p++(ERROR)

 const char*p 即char*p是个常量,所以内容是常量。
 char* const p; 即指针p是个常量。


(3) char*p定义的是一个指针变量p,指向字符串abc的首地址。这里特别要注意,在C语言中,(3)式定义的是一个常量字符串,
它被放在静态存储区的常量区进行存储,而p是一个指针变量,放在栈上。
如果*p='b',在编译时能通过,但在运行时就会出现错误,因为你试图去改变常量区的内容。
const int * const p = &a;    // *p 和 p均不可改变了


================================引用==================================
引用就是别名

对象的别名:
#include<iostream>
using namespace std;
class man
{
public:
    int get() {return i;}
    void set(int x){i=x;}
private:
    int i;

};

int main(void)
{
    man a;
    man &ra=a;  //引用定义的时候就要初始化【引用就像常量,只能初始化,不能赋值】
    ra.set(123);
    cout<<ra.get();
    return 0;

}

参数的别名:
#include<iostream>
using namespace std;
void swap1(int &a, int &b)  //利用别名交换交换两个数
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}
int main(void)
{
    int  a =1;
    int b=2;
    swap1(a,b);
    cout<<a  << b;
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值