一:指针
(1)指针的概念:程序的变量和常量都存储在一个地址数值中,内存地址就表示变量或者常量在内存中的存储位置。
指针就是存储内存地址的变量。
例如:int p = 0; int *q = &p;
(2)指针操作数组
int a[]={1,2,3,4};
int *p = &a[0]; => *p = a; p代表数组a[0]首地址
int p1 = &a[2];
int diff = p1-p; //计算的是地址距离 =2 ;而不是字节数
double beans[5][5];
double pbeans = *beans[0][0];
double *pbeans = beans[0] //等于首位的地址 数组他是顺序存储的
(3) const对象指针和const的区别
const 指针 和 指向 const对象的指针的区别:
指向 const对象的指针 :指针指向const对象的地址,我们可以使用指针来修改里面的数值,地址本身是不能修改的。
const double *cptr; //cptr 指向的是一个double类型的数值, cptr地址数值是可以改变的
cptr 本身不是const,const 只是限定了 cptr必须指向double类型的对象,但是double类型里面数值是不能更改的。
const指针的数值不能修改但是可以修改指向对象的数值,指向const变量的指针不能修改const变量的数值但是可以修改本身的数值
const char * pc = "abcd” //表示pc指针指向的是一个字符串常量,所以不能改变常量的数值
char * const pc = "abcd” //表示 pc是一个常量地址数值,指向的是’abcd”的地址不能改变这个地址数值但是可以改变字符串的数值。
(4)数组指针和指针数组的区别
数组指针就是普通的数组
例如: int a[2] = {1,2};
指针数组,就是数组里存放的数据是指针类型:
char *charset[] = {"aaaaa","bbbb","cccc"};
#include<iostream>
using namespace std;
int main(void)
{
const char* pc = "abcd";
char* const pb = "aaccdd";
pc = "FGCD"; // 可以修改地址数值,但是不能修改字符串常量的数值
cout<<pc[0]<<endl;
pb[0] = 'A'; // 段错误
cout<<pb[0]<<endl;
return 0;
}
(5) 函数指针
函数指针:指向函数的指针,函数存放也是需要在内存中存放的,函数也是有地址数值的。
函数指针也指向某个特定的类型,函数类型尤其返回类型和形参决定的,与函数名称无关。
函数指针的示例代码如下:
int (*f)( int x )
double (*ptr)(double x)
//声明一个函数
int fun( int x )
//声明一个函数指针;
int (*f)(int x)
f = fun; // fun 函数的首地址赋值给函数指针
// 定义函数指针
int (*p)();
p = f //赋值
(*p)(a,b); //调用函数指针
指针函数和函数指针的区别:
指针函数:返回类型是指针类型的函数,本质是函数。
函数指针:函数指针是指针,一个指向函数的指针。
(6) this指针
this指针是一个隐含的指针,表示当前对象的数值。
void Date::SetMonth( int m )
{
month = m;
this->month = m ; // this指针
}