一.关于指针
指针一直被C/C++学习者认为是一个最难的点之一.指针本身其实是一种变量类型,它的值是一个内存地址,而这个地址的内存单元存储着数据.32位机器上通常指针大小为4.也许有人会问既然都是内存地址,为什么要区分指针的类型呢,比如int指针和double类型指针有何区别?这个问题的答案是因为给定内存地址,系统需要根据类型来解释内存内容,int型占用4个字节,系统根据指针提供的首地址,获取连续的4个字节的内容,如果是double型,则会获取连续的8个字节的内容.所以实际上指针存储的只是首地址.
1.指针变量的定义以及初始化
001
002
|
int
*pint ;
//指向一个int整数
double
*pdou;
|
当然,你也可以在定义的时候同时初始化变量
001
002
003
004
|
int
parag = 100;
int
*pint = ¶g;
char
str[100];
char
*pstr = str;
|
这里千万不要当成复制语句了,因为有些人无法理解这里的解引用操作*的作用只是定义变量.
2.引用和指针的区别
引用其实只是变量的一个别名,所以必须初始化,而且引用关系一旦绑定,就不能改变引用到另外一个变量,之后使用引用或者原名的操作是等效的,因为二者实际上就指的是一个东西.
看下下面的程序或者你就明白了:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
|
#include<iostream>
using
std::cout;
using
std::endl;
int
main()
{
int
a = 0;
int
b = ;
int
&refA = a;
int
*pA = &a;
//--------------------
//the outcome is: 100 100 100
cout<<
"a:"
<<a<<
" refA:"
<<refA<<
" *pA:"
<<*pA<<endl;
refA = ;
//the outcome is : 80 80 80
cout<<
"a:"
<<a<<
" refA:"
<<refA<<
" *pA:"
<<*pA<<endl;
*pA = ;
//the outcome is : 81 81 81
cout<<
"a:"
<<a<<
" refA:"
<<refA<<
" *pA:"
<<*pA<<endl;
pA = &b;
//the outcome is : 81 81 99
cout<<
"a:"
<<a<<
" refA:"
<<refA<<
" *pA:"
<<*pA<<endl;
return
0;
}
|
3.迭代器
迭代器其实是标准库中只能用于容器元素访问的一种结构.
4.const指针和指向const对象的指针
const 指针定义方式如下:
001
|
*
const
ptr = &a;
|
const指针指的是指针变量本身是const,不能修改,比如你无法在初始化后再prt = &b,但是你可以*ptr = b.所以你必须在定义时候初始化,否则该指针就成了无法赋值的空指针了.
指向const对象的指针定义方式如下:
001
|
const
int
*ptr = &a;
|
它指的是这个指针变量指向的对象是一个const类型的,你可以初始化后再进行ptr = &b,但是你不能*ptr = b.由于该指针是可以赋值的,所以,你并不一定要初始化指向const对象的指针.
1. const对象地址只能赋值给指向const对象的指针
2. 非const对象地址可以赋值给const对象,但是不能通过该指针来修改对象
3. 可以理解为“自以为指向const对象的指针”