指针
1、指针定义:
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
2、指针的声明与运用:
#include <iostream>
using namespace std;
int main(void)
{
int x = 20;
int *p;//声明指针
p = &x;//指针指向地址,然后修改指针所指向的地址
*p = 20;//*p 表示取指针的值,并将地址为(&x)的内存单元的内容修改为20
return 0;
}
3、指针与数组
可以利用指针p++来依次访问存储位置相邻的数组的值
#include <iostream>
using namespace std;
int main(void)
{
int a[5] = {0,1,2,3,4,5};
int *p;
p = &a[0];//将p定位到a[0]的位置
p++;//将p指向下一个位置,就是a[1]的位置
return 0;
}
4、当指针作为参数时
对函数的形参的值修改也会将实参的值改变
#include <iostream>
using namespace std;
void Swap(int *a,int *b)
{
int x = *a;//暂时存储a的值
*a = *b;//将a指针指向的值改为b指针所指的值
*b = x;//将b指针指向的值改为a指针未改变之前所指向的值,就是暂存在x中的值
}
int main(void)
{
int x = 1,y = 2;
Swap(&x,&y);//这里要传递地址
printf("x = %d,y = %d\n",x,y);//发现x,y的值发生了变化
return 0;
}
5、从函数返回指针
Note:C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static变量。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int *RandRom()
{
static int tp[10];
srand( (unsigned)time( NULL ) );
for(int i=0;i<10;i++){
tp[i] = rand();
}
return tp;
}
int main(void)
{
int *p;
p = RandRom();
for(int i=0;i<10;i++){
cout<<"i = "<<i<<",*(p+i) = ";
cout<<*(p+i)<<endl;
}
return 0;
}
引用
1、定义
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
2、引用和指针的区别
1、不存在空引用,引用必须连接到一块合法的内存
2、一旦一个引用初始化为一个对象,就不能再转为另一个对象。指针随时可以指向另一个对象。
3、引用必须在创建时被初始化,指针可以在任何时候被初始化。
3、引用的创建
引用的值会随着引用对象的值的改变而改变
#include <iostream>
using namespace std;
int main(void)
{
int n = 3;
int& x = n;//这里一定要初始化
n = 7;
cout<<"n = "<<n<<",x = "<<x<<endl;
return 0;
}
4、引用作为参数
#include <iostream>
using namespace std;
void Swap(int& x,int &y)//形参的类型是引用
{
int t = x;
x = y;
y = t;
}
int main(void)
{
int a = 1,b = 2;
Swap(a,b);
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
return 0;
}
5、引用作为返回值
当返回一个引用时,被引用的对象不能超过作用域,所以一个对局部变量的引用是不合法的,但是可以返回一个对静态变量的引用。
#include <iostream>
using namespace std;
int& Mul(int x,int y)
{
static int ans = x*y;//这里引用的返回值设为static
return ans;
}
int main(void)
{
int a = 6,b = 7;
int c = Mul(a,b);
cout<<"c = "<<c<<endl;
return 0;
}