今天试着做了做 用引用交换两个字符串的内容。
顺带着用指针做了一下。又一次体验了指针的强大
#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;
}
通过指针改变了私有成员变量
指针……传地址改内容,传地址的地址改变地址,……………………