对指针进行初始化或者赋值只能使用一下四中类型的值:
0值常量表达式
类型匹配的对象的地址
另一对象末的下一地址
同类型的另一个有效指针
把int型变量赋值给指针是非法的,尽管此int型变量的值可能为0.
std::string s ="1234567";
std::string*sp =&s;
int zero =0;
int *ip=zero;//错误信息 error C2440: 'initializing' : cannot convert from 'int' to 'int *'
int *ip1 =sp;//错误信息 error C2440: 'initializing' : cannot convert from 'std::string *' to 'int *'
int *ip2=&s;//错误信息 error C2440: 'initializing' : cannot convert from 'std::string *' to 'int *'
C++提供了一种特殊的指针 void *,他可以保存任何类型对象的地址
接上面的例子
void *ip1 =sp;//正确
void *ip2=&s;//正确
不过void *依然不能给赋值为int,即如下依然报错(注意保存信息是void):
void *ip=zero;//错误信息 error C2440: 'initializing' : cannot convert from 'int' to 'void *'
void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。不能使用void*指针操纵它所指向的对象。
***注意如下,要cout字符串,必须#include <string>
std::string s1 ="1234567";
cout《s1《endl;//输出:1234567
sp =&s1;
std::cout《sp《endl;
*sp="7878";
std::cout《*sp《endl;//输出:7878
考虑以下两个程序段。第一个程序段将一个指针赋给另一指针:
int ival1 = 1024, ival2 = 2048;
int *pi = &ival1, *pi2 = &ival2;
pi = pi2; // pi现在指向ival2
赋值结束后,pi 所指向的 ival 对象值保持不变,赋值操作修改了 pi 指针的值,使其指向另一个不同的对象。现在考虑另一段相似的程序,使用两个引用赋值:
int &ri = ival1, &ri2 = ival2;
ri = ri2; // 将ival2的值赋值给ival1
这个赋值操作修改了 ri 引用的值 ival 对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象(&ri和&ri2这两个地址的值依旧是原来的地址的值),此时这两个对象的值相等。
可以通过四个输出看出效果
int ival1=1204,ival2=2048;
int &r1=ival1,&r2=ival2;
std::cout《r1《","《r2《endl;
std::cout《&r1《","《&r2《endl;
r1=r2;
std::cout《r1《","《r2《endl;
std::cout《&r1《","《&r2《endl;//地址和上面的相同语句输出显示完全一样
Console::WriteLine(L"Hello World");
Console::ReadLine();
C++中,指针和数组密切相关,特别是在表达式中使用数组名时,这个名字会自动转换为指向数组第一个元素的指针。如下:
int ia[] ={0,2,4,6,8};
int *ip=ia;
int *ip1=&ia[0];
cout《ip《endl;//
cout《ip1《endl;
cout《&ia[0]《endl;
cout《&ia 《endl;
cout《&ia 《endl;
cout《&ia 《endl;
cout《&ia 《endl;
其中ip、ip1都等于&a[0],也就是数组的第一个元素的地址。
通常,在指针上加上(或者减去)一个整型数值n后,等效于获得一个新指针,这个新指针指向指针原来指向的元素之后(或者之前)的第n个元素。上面的指针例子用的是int*,可能效果不明显,换成string*来测试一下。
string ia[] ={"0","2","4","6","8"};
string *ip=ia;
string *ip1=&ia[0];
cout《"ip:"《ip《endl;//
cout《"ip1:"《ip1《endl;
cout《"&ia[0]:"《&ia[0]《endl;
cout《"&ia :"《&ia 《endl;
cout《"&ia :"《&ia 《endl;
cout《"&ia :"《&ia 《endl;
cout《"&ia :"《&ia 《endl;
ip1=ip+1;
cout《"ip1+1之后的值:"《ip1《endl;
Console::WriteLine(L"Hello World");
Console::ReadLine();