指针是用来专门存放地址的数据类型
1、定义一个指针时,必须规定它指向的变量类型,如int* p
【注意:如果写成int * ipa,ipb,ipc,其实只有ipa是指针类型,ipb、ipc还是int类型】
2、最好能初始化,即int a=47;int* p=&a;
,C++编程的一般原则是定义时初始化
指针传递
通常,向函数传递参数时,在函数内部生成该参数的拷贝,称为“按值传递”。
如果我们传递一个指针给函数,实际上就是传递外部对象的别名,使函数能修改外部对象。(外部对象:如以下程序中,对于f(),main中的x就是外部对象)
#include <iostream>
using namespace std;
void f(int* p){
cout<<"p= " <<p <<std::endl;
cout<<"*p= "<<*p<<std::endl;
*p=5;
cout<<"*p= "<<p<<std::endl;
}
int main(){
int x=47;
cout<<"x= "<<x<<std::endl;
cout<<"&x= "<<&x<<std::endl;
//传入指针
f(&x);
cout<<"x= "<<x<<std::endl;
return 0;
}
int *p=&x; 定义指针
*p:取指针p指向的变量的值
&x:取变量x的地址
引用传递
引用传递参数,不用int*传递指针,而是用int&传递实参的引用,带引用的参数调用比带指针的函数调用在语法上更加清晰。
#include <iostream>
using namespace std;
void f(int& r){
//用int&r作为引用参数,直接传递调用者参数的地址
cout<<"&r= "<<r<<endl;
}
int main(){
int x=47;
f(x);
return 0;
}
理解:
1、指针是指向一个变量的,保存的是该变量的地址,相当于该变量的一个别名,指针传递参数相当于保存了该变量的地址,传递给调用函数,咋调用函数中通过指针拿到该变量值
2、引用传递,实际上就是传递实参,而被调用函数的形参是该实参的引用。
void*:意味着任何类型的地址都可以间接引用那个地址。
int*:只能针对int类型变量的地址可以间接引用那个地址。
一旦间接引用void*,就会丢失关于类型的信息,使用前必须转换。
int i=99;
void* vp=&i;
*((int*) vp)=3;