c++中指针:
这里先讲几个准备的东西,对于一个函数而言,假如没有其他的作用的话,函数的函数名就是被当做是函数的地址使用的,就像是数组一样,数组是不能够被复制的,数组的数组名就是自动的可以转化为这个数组的第一个值得地址。
1.指向函数的指针
eg: int (*p)(int t,string s);首先明确一点,这样的造型就是一个指向函数的指针的形式,遵循从内到外的原则进行读,那就是p是一个指针,这个指针式指向一个接受两个形参的而且返回类型是int的一个函数。 可以用typedef进行对于这种指针的简化,先举个例子来说:typedef int(* pointer )(int &,int &)那么这个时候pointer就是作为一类指针而言了,而且这个类的指针式可以定义指针的,这里这个pointer就是代表了一类指向两个形参,形参为int的返回类型是int的函数的指针,同时可以用pointer进行对指针的赋值,pointer a;这里a就是被定为一个指向接受两个int形参,返回一个int的函数。
2.指向数组的指针
一维数组:
举个例子:int a[12]对于一维数组而言,他的a表示的就是这个一维数组的首地址,所以a=&a[0],此外还有的就是*(a+n)=a[n],这个是必须把当做公式一样来记忆。还有就是假如把数组作为函数的形参进行传递的话实际上传递的是数组的地址,也就是指针了,那么我们可以这样的f(int a[]),或者是f(int *a)
此外还有一个要记忆的就是对于一维的char来说 char *m="asdaw";这是可以的
二维数组:
对于二维数组例如int a[10][10]就是可以是看做为一个十行十列的矩阵了,那么对于他的首地址呢?a就是表示的是第一行的整形数组的地址,记住这里是指的是数组的首地址
那么假如a+1的话实际上就是指的是(可以见课本比较形象)指向下一个十行数组的指针,那么*(a+1)的呢,他的意思是下一个十行数组的第一个整形数字的地址也就是,实际上这里面,a+1和*(a+1)是一样的,经过测试的。
那么对于*(*(a+1)+2)指的就是a[1][2],此外假如用二维数作为函数的形参的话,一样的记住的是传递的是指针,但是编译器是很友好的,那么就是可以也是传递一个二维数组的,f(int (*a)[10])(这里的是指一个指向10行一个的指针,指针指向的是一个int的数组)或者是f(int a[][10])反正无论如何都要确定的是有多少的行,
对于这个数组的初始化的话int *p=&a[0][0],或int *p=a[0]//这里不使用取地址的原因是a[0]=*(a+0)=*a就是第一行的首地址。
此外还要注意的就是一个int *p[10]这里的意思是一个十个的数组,全是指向int的指针。
3.const修饰的对象和指针
int const *p 和const int *p一样的都是指的是p所指向的对象是const的,此外,int * const p那么就是表明的话p是一个const的指针了。
还有就是迭代器const_iterator 和const iterator 前者是指迭代器指向的那个元素是一个const的,后者则是表示这个迭代器是一个const的,
这里先讲几个准备的东西,对于一个函数而言,假如没有其他的作用的话,函数的函数名就是被当做是函数的地址使用的,就像是数组一样,数组是不能够被复制的,数组的数组名就是自动的可以转化为这个数组的第一个值得地址。
1.指向函数的指针
eg: int (*p)(int t,string s);首先明确一点,这样的造型就是一个指向函数的指针的形式,遵循从内到外的原则进行读,那就是p是一个指针,这个指针式指向一个接受两个形参的而且返回类型是int的一个函数。 可以用typedef进行对于这种指针的简化,先举个例子来说:typedef int(* pointer )(int &,int &)那么这个时候pointer就是作为一类指针而言了,而且这个类的指针式可以定义指针的,这里这个pointer就是代表了一类指向两个形参,形参为int的返回类型是int的函数的指针,同时可以用pointer进行对指针的赋值,pointer a;这里a就是被定为一个指向接受两个int形参,返回一个int的函数。
2.指向数组的指针
一维数组:
举个例子:int a[12]对于一维数组而言,他的a表示的就是这个一维数组的首地址,所以a=&a[0],此外还有的就是*(a+n)=a[n],这个是必须把当做公式一样来记忆。还有就是假如把数组作为函数的形参进行传递的话实际上传递的是数组的地址,也就是指针了,那么我们可以这样的f(int a[]),或者是f(int *a)
此外还有一个要记忆的就是对于一维的char来说 char *m="asdaw";这是可以的
二维数组:
对于二维数组例如int a[10][10]就是可以是看做为一个十行十列的矩阵了,那么对于他的首地址呢?a就是表示的是第一行的整形数组的地址,记住这里是指的是数组的首地址
那么假如a+1的话实际上就是指的是(可以见课本比较形象)指向下一个十行数组的指针,那么*(a+1)的呢,他的意思是下一个十行数组的第一个整形数字的地址也就是,实际上这里面,a+1和*(a+1)是一样的,经过测试的。
那么对于*(*(a+1)+2)指的就是a[1][2],此外假如用二维数作为函数的形参的话,一样的记住的是传递的是指针,但是编译器是很友好的,那么就是可以也是传递一个二维数组的,f(int (*a)[10])(这里的是指一个指向10行一个的指针,指针指向的是一个int的数组)或者是f(int a[][10])反正无论如何都要确定的是有多少的行,
对于这个数组的初始化的话int *p=&a[0][0],或int *p=a[0]//这里不使用取地址的原因是a[0]=*(a+0)=*a就是第一行的首地址。
此外还要注意的就是一个int *p[10]这里的意思是一个十个的数组,全是指向int的指针。
3.const修饰的对象和指针
int const *p 和const int *p一样的都是指的是p所指向的对象是const的,此外,int * const p那么就是表明的话p是一个const的指针了。
还有就是迭代器const_iterator 和const iterator 前者是指迭代器指向的那个元素是一个const的,后者则是表示这个迭代器是一个const的,