C++ Primer 学习笔记_12_指针(续)
2015-11-06 11:16
465 查看
在C++中,数组与指针关系密切,当在表达式中使用数组名时,会自动将数组名转换成为指向数组的第一个元素的指针!
[cpp]
view plaincopyprint?
int ia[] = {0,1,2,3,4,5,5};
int *ip = ia;
ip = &ia[4];
2、指针的算术操作
1)通常,在指针上加上/减去一个整数n,就获得了一个新的指针,该指针指向原指针的后面/前面的第n个元素。
[cpp]
view plaincopyprint?
int ia[] = {0,1,2,3,4,5,5};
int *ip = ia;
cout << *(ip + 4) << endl;
2)只要两个指针指向的是同一数组,或者指向的是该数组的末端的下一个单元,C++还支持这两个指针做减法运算,结果类型为ptrdiff_t。
ptrdiff_t在cstddef头文件中定义,该保证足以存放同一数组两个指针间的距离!
[cpp]
view plaincopyprint?
ptrdiff_t n = ip2 – ip1;
3、当使用下标访问数组时,其实就是使用下标访问指针
[cpp]
view plaincopyprint?
int ia[] = {0,2,4,6,8};
int *p = &ia[2];
cout << p[1] << endl;
cout << p[-1] << endl;
4、计算数组超出末端指针
C++虽然允许计算数组或对象的超出末端的地址,但是不允许对该地址进行解引用操作,而计算数组超出末端位置之后,或数组首地址之前的地址都是不合法的!
[cpp]
view plaincopyprint?
const int arr_size = 5;
int ia[arr_size] = {0,2,4,6,8};
int *p = ia;
/*
*对q的解引用将得到无效值,但是对于大多数编译器来说,
*会把对q解引用的结果视为一个int型数据!
*/
int *q = p + arr_size;
for (; p != q; ++p)
{
cout << *p << endl;
}
5、输出数组元素
[cpp]
view plaincopyprint?
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;
}
[cpp]
view plaincopyprint?
//P110 4.18
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特性!
[cpp]
view plaincopyprint?
const double *cptr;
const限定了cptr指针所指向的对象的类型,而并非cptr本身!
可以把指向const的指针理解为“自以为指向const的指针”
[cpp]
view plaincopyprint?
const double val = 3.14;
double *pval1 = &val; //ERROR
const double *pval2 = &val; //OK
double val = 3.14;
const double *pval = &val; //OK
[cpp]
view plaincopyprint?
//示例
int main()
{
double val = 3.14;
const double *pval = &val;
*pval = 2; //ERROR
double *pval2 = &val;
*pval2 = 1;
cout << *pval << endl;
return 0;
}
在实际应用中:指向const对象的指针常用做函数的行参!
7、const指针
const指针---指针本身值不能修改,因此const指针必须在定义时初始化,而且初始化之后再也不能修改。【好专一啊(*^__^*)】
而指针所指对象的值能否修改,则完全取决于该对象的类型。
[cpp]
view plaincopyprint?
int errNumb = 0;
int *const curErr = &errNumb;
*curErr = 1; //OK
cout << errNumb << endl;
int temp = 123;
curErr = &temp; //ERROR
cout << *curErr << endl;
8、指向const对象的const指针。
既不能修改指针的值,也不能修改指针所指向对象的值。
[cpp]
view plaincopyprint?
//示例
const double val = 3.14;
const double *const pval = &val;
double val = 3.14;
const double *const pval = &val;
9、指针和typedef
[cpp]
view plaincopyprint?
//考虑下面的ERROR是为什么?
typedef string *pstring;
const pstring p; //ERROR
const string *q; //OK
答疑:在C++中,const限定符既可以放在类型前面也可以放在类型后,即下面两条语句的作用是完全相同的!
[cpp]
view plaincopyprint?
const string s;
string const s;
[cpp]
view plaincopyprint?
//示例
string s;
/*
*下面的几条定义的作用是一样的!
*/
typedef string *pstring;
const pstring p1 = &s;
pstring const p2 = &s;
const string *p3 = &s;
string const *p4 = &s;
指针(续)
1、使用指针访问数组元素在C++中,数组与指针关系密切,当在表达式中使用数组名时,会自动将数组名转换成为指向数组的第一个元素的指针!
[cpp]
view plaincopyprint?
int ia[] = {0,1,2,3,4,5,5};
int *ip = ia;
ip = &ia[4];
int ia[] = {0,1,2,3,4,5,5}; int *ip = ia; ip = &ia[4];
2、指针的算术操作
1)通常,在指针上加上/减去一个整数n,就获得了一个新的指针,该指针指向原指针的后面/前面的第n个元素。
[cpp]
view plaincopyprint?
int ia[] = {0,1,2,3,4,5,5};
int *ip = ia;
cout << *(ip + 4) << endl;
int ia[] = {0,1,2,3,4,5,5}; int *ip = ia; cout << *(ip + 4) << endl;
2)只要两个指针指向的是同一数组,或者指向的是该数组的末端的下一个单元,C++还支持这两个指针做减法运算,结果类型为ptrdiff_t。
ptrdiff_t在cstddef头文件中定义,该保证足以存放同一数组两个指针间的距离!
[cpp]
view plaincopyprint?
ptrdiff_t n = ip2 – ip1;
ptrdiff_t n = ip2 – ip1;
3、当使用下标访问数组时,其实就是使用下标访问指针
[cpp]
view plaincopyprint?
int ia[] = {0,2,4,6,8};
int *p = &ia[2];
cout << p[1] << endl;
cout << p[-1] << endl;
int ia[] = {0,2,4,6,8}; int *p = &ia[2]; cout << p[1] << endl; cout << p[-1] << endl;
4、计算数组超出末端指针
C++虽然允许计算数组或对象的超出末端的地址,但是不允许对该地址进行解引用操作,而计算数组超出末端位置之后,或数组首地址之前的地址都是不合法的!
[cpp]
view plaincopyprint?
const int arr_size = 5;
int ia[arr_size] = {0,2,4,6,8};
int *p = ia;
/*
*对q的解引用将得到无效值,但是对于大多数编译器来说,
*会把对q解引用的结果视为一个int型数据!
*/
int *q = p + arr_size;
for (; p != q; ++p)
{
cout << *p << endl;
}
const int arr_size = 5; int ia[arr_size] = {0,2,4,6,8}; int *p = ia; /* *对q的解引用将得到无效值,但是对于大多数编译器来说, *会把对q解引用的结果视为一个int型数据! */ int *q = p + arr_size; for (; p != q; ++p) { cout << *p << endl; }
5、输出数组元素
[cpp]
view plaincopyprint?
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;
}
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; }
[cpp]
view plaincopyprint?
//P110 4.18
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;
}
}
//P110 4.18 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特性!
[cpp]
view plaincopyprint?
const double *cptr;
const double *cptr;
const限定了cptr指针所指向的对象的类型,而并非cptr本身!
可以把指向const的指针理解为“自以为指向const的指针”
[cpp]
view plaincopyprint?
const double val = 3.14;
double *pval1 = &val; //ERROR
const double *pval2 = &val; //OK
double val = 3.14;
const double *pval = &val; //OK
const double val = 3.14; double *pval1 = &val; //ERROR const double *pval2 = &val; //OK double val = 3.14; const double *pval = &val; //OK
[cpp]
view plaincopyprint?
//示例
int main()
{
double val = 3.14;
const double *pval = &val;
*pval = 2; //ERROR
double *pval2 = &val;
*pval2 = 1;
cout << *pval << endl;
return 0;
}
//示例 int main() { double val = 3.14; const double *pval = &val; *pval = 2; //ERROR double *pval2 = &val; *pval2 = 1; cout << *pval << endl; return 0; }
在实际应用中:指向const对象的指针常用做函数的行参!
7、const指针
const指针---指针本身值不能修改,因此const指针必须在定义时初始化,而且初始化之后再也不能修改。【好专一啊(*^__^*)】
而指针所指对象的值能否修改,则完全取决于该对象的类型。
[cpp]
view plaincopyprint?
int errNumb = 0;
int *const curErr = &errNumb;
*curErr = 1; //OK
cout << errNumb << endl;
int temp = 123;
curErr = &temp; //ERROR
cout << *curErr << endl;
int errNumb = 0; int *const curErr = &errNumb; *curErr = 1; //OK cout << errNumb << endl; int temp = 123; curErr = &temp; //ERROR cout << *curErr << endl;
8、指向const对象的const指针。
既不能修改指针的值,也不能修改指针所指向对象的值。
[cpp]
view plaincopyprint?
//示例
const double val = 3.14;
const double *const pval = &val;
double val = 3.14;
const double *const pval = &val;
//示例 const double val = 3.14; const double *const pval = &val; double val = 3.14; const double *const pval = &val;
9、指针和typedef
[cpp]
view plaincopyprint?
//考虑下面的ERROR是为什么?
typedef string *pstring;
const pstring p; //ERROR
const string *q; //OK
//考虑下面的ERROR是为什么? typedef string *pstring; const pstring p; //ERROR const string *q; //OK
答疑:在C++中,const限定符既可以放在类型前面也可以放在类型后,即下面两条语句的作用是完全相同的!
[cpp]
view plaincopyprint?
const string s;
string const s;
const string s; string const s;
[cpp]
view plaincopyprint?
//示例
string s;
/*
*下面的几条定义的作用是一样的!
*/
typedef string *pstring;
const pstring p1 = &s;
pstring const p2 = &s;
const string *p3 = &s;
string const *p4 = &s;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- Lua中调用C++函数示例
- 详解Lua中的数组概念知识
- Lua教程(一):在C++中嵌入Lua脚本
- Perl中的列表和数组学习笔记
- Lua教程(二):C++和Lua相互传递数据示例
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法