标签:
指针
序言:
指针是大多数C程序的重要组成部分,而且在许多C++程序中仍然受到重视!
与迭代器的异同:指针结构更加通用一些,指针用于指向单个对象,而迭代器只能用于访问容器内的对象。
由于指针用于低级操作,容易产生与繁琐细节相关的额错误,因此在现代C++程序中,尽量采用vector和迭代器取代一般的数组、指针,采用string类型取代C风格字符串。【P101】
正文:
指针(1)
1、每个指针都有一个与之关联的数据类型,该数据类型决定了指针所指向的对象的类型。
-
-
-
-
-
vector<int> *pvec;
-
int *pi;
-
string *pstr;
-
double *pdou;
2、指针可能的取值
1)类型匹配对象的地址:&对象
2)类型匹配对象的下一个地址:&(对象+1)
3)0值常量表达式:NULL,例如,在编译时可以获得0值的整型const对象或字面值常量0.
4)同类型的另一个有效的指针
-
-
int value = 1024;
-
int *pi = 0;
-
int *pi1 = &value;
-
int *pi2 = pi;
-
int *pi3;
-
pi = pi2;
-
pi3 = 0;
-
-
int zero = 0;
-
int *p = zero;
-
const int ZERO = 0;
-
int *pz = ZERO;
-
-
int *pnull = NULL;
-
-
double val = 3.14;
-
int *pv = &val;
3、拒绝使用”野指针”!
很多运行时错误都源于使用了未初始化的指针。因为他很难被发现。
如果使用未初始化的指针,会将指针中存放的不确定值视为内存地址,然后操纵该内存地址中保存的内容!
建议:
1)、除非指向的对象已经存在,否则不要先定义指针。
2)、在使用之前初始化所有变量,尤其是指针!
4、void*指针
void*表明该指针与一地址相关,但不清楚存储在该地址上的对象的类型!
void*指针只支持集中有限的操作:
1)与另一个指针进行比较
2)向函数传递void*指针或从函数返回void*指针。
3)给一个void*指针赋值
千万不要使用void*指针操纵他所指向的对象!!!
-
double val = 3.14;
-
int obj = 3;
-
-
double *pval = &val;
-
void *pvoid = pval;
-
pvoid = &val;
-
pvoid = &obj;
5、指针提供间接操纵其所指对象的功能
1)解引用操作符返回指定对象的左值,利用这个功能可以修改所指对象的值。
-
string str("Hello World");
-
string *ps = &str;
-
*ps = "NiHao ShiJie";
-
cout << str << endl;
2)也可以修改指针本身:
-
string str("Hello World");
-
string *ps = &str;
-
string obj("NiHao ShiJie");
-
ps = &obj;
-
cout << *ps << endl;
【P105:关键概念:给指针赋值或通过指针进行赋值,值得仔细品读!】
6、指针与引用的差异
1)定义引用时没有初始化是错误的。
2)给引用赋值修改的是该引用所关联对象的值。
-
string str("hello world");
-
string &rstr1;
-
string &rstr2 = str;
-
rstr2 = "nihao shijie";
-
cout << str << endl;
-
int ival = 1;
-
int ival2 = 2;
-
int &r1 = ival,&r2 = ival2;
-
r1 = r2;
-
cout << r1 << endl;
-
cout << ival << endl;
7、指向指针的指针
-
int ival = 1024;
-
int *pi = &ival;
-
int **ppi = π
-
-
cout << "ival is: " << ival
-
<< "\n*pi is: " << *pi
-
<< "\n**ppi is: " << **ppi << endl;
对指向指针的指针获取其真正的值,需要进行两次解引用!
-
-
int main()
-
{
-
int ival1 = 1024;
-
int *pi = &ival1;
-
-
int ival2 = 2048;
-
pi = &ival2;
-
cout << *pi << endl;
-
-
*pi = 65536;
-
cout << ival2 << endl;
-
}
-
-
int main()
-
{
-
int i = 42,j = 1024;
-
-
int *pi = &i,*pj = &j;
-
*pj = *pi * *pj;
-
*pi *= *pi;
-
-
cout << "*pi = " << *pi << ", *pj = " << *pj << endl;
-
}
指针(2)
1、使用指针访问数组元素
在C++中,数组与指针关系密切,当在表达式中使用数组名时,会自动将数组名转换成为指向数组的第一个元素的指针!
-
int ia[] = {0,1,2,3,4,5,5};
-
int *ip = ia;
-
ip = &ia[4];
2、指针的算术操作
1)通常,在指针上加上/减去一个整数n,就获得了一个新的指针,该指针指向原指针的后面/前面的第n个元素。
-
int ia[] = {0,1,2,3,4,5,5};
-
int *ip = ia;
-
cout << *(ip + 4) << endl;
2)只要两个指针指向的是同一数组,或者指向的是该数组的末端的下一个单元,C++还支持这两个指针做减法运算,结果类型为ptrdiff_t。
ptrdiff_t在cstddef头文件中定义,该保证足以存放同一数组两个指针间的距离!
3、当使用下标访问数组时,其实就是使用下标访问指针
-
int ia[] = {0,2,4,6,8};
-
int *p = &ia[2];
-
cout << p[1] << endl;
-
cout << p[-1] << endl;
4、计算数组超出末端指针
C++虽然允许计算数组或对象的超出末端的地址,但是不允许对该地址进行解引用操作,而计算数组超出末端位置之后,或数组首地址之前的地址都是不合法的!
-
const int arr_size = 5;
-
int ia[arr_size] = {0,2,4,6,8};
-
-
int *p = ia;
-
-
-
-
-
int *q = p + arr_size;
-
for (; p != q; ++p)
-
{
-
cout << *p << endl;
-
}
5、输出数组元素
-
const size_t arr_sz = 5;
-
int int_arr[arr_sz] = {0,1,2,3,4};
-
-
for (int *pbegin = int_arr,*pend = int_arr+arr_sz; pbegin != pend; ++pbegin)
-
{
-
cout << *pbegin << endl;
-
}
-
-
int main()
-
{
-
const size_t arr_sz = 5;
-
int int_arr[arr_sz];
-
-
for (int *p = int_arr,*q = int_arr + arr_sz; p != q; ++p)
-
{
-
*p = 0;
-
cout << *p << endl;
-
}
-
-
}
6、指向const对象的指针
不允许通过指针来修改其所指的const值。C++强制要求指向const对象的指针也必须具有const特性!
const限定了cptr指针所指向的对象的类型,而并非cptr本身!
可以把指向const的指针理解为“自以为指向const的指针”
-
const double val = 3.14;
-
double *pval1 = &val;
-
const double *pval2 = &val;
-
-
double val = 3.14;
-
const double *pval = &val;
-
-
int main()
-
{
-
double val = 3.14;
-
const double *pval = &val;
-
*pval = 2;
-
-
double *pval2 = &val;
-
*pval2 = 1;
-
-
cout << *pval << endl;
-
return 0;
-
}
在实际应用中:指向const对象的指针常用做函数的行参!
7、const指针
const指针---指针本身值不能修改,因此const指针必须在定义时初始化,而且初始化之后再也不能修改。【好专一啊(*^__^*)】
而指针所指对象的值能否修改,则完全取决于该对象的类型。
-
int errNumb = 0;
-
int *const curErr = &errNumb;
-
*curErr = 1;
-
cout << errNumb << endl;
-
-
int temp = 123;
-
curErr = &temp;
-
cout << *curErr << endl;
8、指向const对象的const指针。
既不能修改指针的值,也不能修改指针所指向对象的值。
-
-
const double val = 3.14;
-
const double *const pval = &val;
-
-
double val = 3.14;
-
const double *const pval = &val;
9、指针和typedef
-
-
typedef string *pstring;
-
const pstring p;
-
const string *q;
答疑:在C++中,const限定符既可以放在类型前面也可以放在类型后,即下面两条语句的作用是完全相同的!
-
const string s;
-
string const s;
-
-
string s;
-
-
-
-
typedef string *pstring;
-
const pstring p1 = &s;
-
pstring const p2 = &s;
-
const string *p3 = &s;
-
string const *p4 = &s;
本文借鉴:http://blog.csdn.net/column/details/zjf666.html?&page=5
版权声明:欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合
C++(5)指针
标签:
原文地址:http://blog.csdn.net/u011225629/article/details/47343505