1. 指针即地址,指针类型的变量前面要加*,&是取变量的地址
int a,b;
int *p1,*p2;
a=100;b=10;
p1=&a;
p2=&b;
cout<<*p1<<" "<<*p2<<endl;//*p1是a的实际值
return 0;
2. 值传递和引用传递
#include <iostream>
using namespace std;
/**
C++中引用传递的两种方式:*和&
引用方式更加简洁,直观
/*
函数的参数类型是指针类型,将变量的地址传给形参,
仍然是值传递的方式,只是实参的值是变量的地址
*/
void swap(int *p1,int *p2);
/*
引用传递
*/
void swap(int &,int &);
/*
值传递,并未改变传入的值
*/
void swapValue(int,int);
int main()
{
int a=10,b=90;
swapValue(a,b);//实际并未交换
cout<<a<<" "<<b<<endl;
int *p1,*p2;
p1 = &a;
p2 = &b;
swap(p1,p2);
cout<<a<<" "<<b<<endl;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
void swap(int *p1,int *p2)//值传递,但是传递的变量是地址,所以也改变了值
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
void swap(int &p1,int &p2)//引用传递,改变了值
{
int t;
t=p1;
p1=p2;
p2=t;
}
void swapValue(int p1,int p2)//值传递,没有改变原来的值
{
int t;
t=p1;
p1=p2;
p2=t;
}
3. 数组的指针
#include <iostream>
using namespace std;
int main()
{
int a[10]={1,2};
int *p;
// p=a;//数组名代表数组中第一个元素的地址
for(p=a;p<a+10;p++)//这种方式取数组值最快,不必每次都重新计算地址
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
二维数组:
#include <iostream>
using namespace std;
int main()
{
int a[3][4]={1,2};
int *p;
for(p=a[0];p<a[0]+12;p++)//a[0]是a[0][0]的地址,a[0]是第一行数组的名字,所以是地址
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
4. 引用
&a如何区分是声明引用变量还是取地址操作:
如果前面有类型符,如int &a,则是引用;
如果前面无类型符,如cout<<&a,则是取地址。
/*引用的作用是为变量起一个别名*/
int main()
{
int a=10;
int &b=a;//声明b是a的引用,
a++;//a的值变化了,b的值也变化了
cout<<a<<" "<<b<<endl;
return 0;
}
5. 指针数组
int main()
{
char str[] = "I love China";
cout<<str<<endl;
string str1 = "I love China";//string是C++的STL中的
cout<<str1<<endl;
str1 = "abc";
cout<<str1<<endl;
/*定义一个字符指针变量str2,用字符串"I love China"对它初始化,实际上是把字符串的第一个元素的地址赋给str*/
const char * str2 = "I love China";//char * 是C语言中的字符串
//加const防止出现warning:deprecated conversion from string constant to ‘char*’
/*输出时,系统先输出str指向的第一个字符数据,然后使str2自动加1,指向下一个字符,然后再输出一个字符,直到遇到'\0'*/
cout<<str2<<endl;
str2 = "2323";//可重新赋值
cout<<str2<<endl;
const char * name[] = {"bsic","23","sjk","wqu"};
for(int i=0;i<4;i++)
cout<<name[i]<<" ";
cout<<endl;
return 0;
}