指针-----swap

“万能”的指针
 

今天试着做了做 用引用交换两个字符串的内容。

顺带着用指针做了一下。又一次体验了指针的强大

#include<iostream.h>
#include<string.h>
#include<malloc.h>

void swap(char *&a,char *&b); //此函数与void swap(char *a,char *b)并不是重载函数
void swap(char **a,char **b);
void swap(char *a,char *b);

//这是我做的几种尝试。

int main(void)
{
char *a = "Hello!";//注意此处a指向的是字符串常量,用一级指针是无法修改其内容的
char *b = "How are you?";
cout<<a<<endl;
cout<<b<<endl;
swap(a,b);//调用void swap(char *&a,char *&b)或void swap(char *a,char *b);
swap(&a,&b);//调用void swap(char **a,char **b);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}

void swap(char *&a,char *&b)//利用 指针的引用
{
char *temp;
temp = a;
a = b;
b = temp;
}

void swap(char *a,char *b)//调用该程序,运行是崩溃
{
//这里虽然是想通过 传地址 改变值,无奈值却不是可以修改的。
char *temp;
temp = (char *)malloc (sizeof(a));
strcpy(temp,a);
strcpy(a,b); //此处 access violation
strcpy(b,temp); //同理 access violation
}

void swap(char *a,char *b)//若此处只是swap(a,b)值是不会交换的,传地址是无法改变地址的
{
char *temp;
temp = a;
a = b;
b = temp;//试图传地址改变地址。
//但是却达不到我们期望的swap的效果,该函数结束后,a,b的指向依旧没有变。
//传地址改变值。要想改变地址(指向),那就要传地址的地址了,也就是指针的指针。
}

下面的这个函数就是通过传指针的指针,来改变指向。

void swap(char **a,char **b)//只要有地址,就算你只是只读的,用指针的指针也是能改变其内容的
{
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

 

总的一句话,只要有地址,就能用指针去改变内容。

再举一个例子吧:在c++类中,我们知道类的private和protected成员变量是不允许外部函数(也就是非成员函数)直接调用的,所以通常情况下在外部函数是不允许我们修改其内容的,但是指针又一次发挥了它的“万能”。

#include<iostream.h>
class A
{
private:
int m_a;
int m_b;
public:
A(int i,int j)
{
   m_a = i;
m_b = j;
}

void print()
{
   cout<<m_a<<<" "<m_b<<endl;
}
};

int main(void)
{
A a(2,3);
a.print();
int *p;
p = (int*)&a;
*p = 3;//修改私有成员m_a的值
*(p+1) = 4;//修改私有成员m_b的值
a.print();
return 0;
}
通过指针改变了私有成员变量

 

指针……传地址改内容,传地址的地址改变地址,……………………

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值