第六章指针与数组 61指针与地址 6.6排序与查找 62this指针 6.7指针数组 63数组与指针 68函数指针及其应用 6.4多维数组与指针 6.9复杂指针及其他 6.5模板 6.10 Windows对象句柄
第六章 指针与数组 6.1 指针与地址 6.5 模板 6.4 多维数组与指针 6.3 数组与指针 6.2 this 指针 6.10 Windows对象句柄 6.9 复杂指针及其他 6.8 函数指针及其应用 6.7 指针数组 6.6 排序与查找
61指针島地址圆 6.1.1指针的概念 6.1.2指针变量的赋值、初始化与简单应用 D
6.1 指针与地址 6.1.1指针的概念 6.1.2 指针变量的赋值、初始化与简单应用
61.1指针的攏念 按变量的地址直接存取变量的方法称为“直接访问”方式。存贮 变量的内存空间的首地址称为该变量的地址。 如果将一个变量的地址放在另一个变量中,则存放地址的变量称 为指针变量。这样存取变量,也可以间接的由指针变量取得该变 量的地址进行,称为“间接访问”方式。由于指针变量中的值是 另一个变量的地址,我们习惯上形象地称为指针变量指向该变量。 指针变量中的值也简称为指针,所以指针就是地址 指针类型可以按它指向的变量的类型区分。 指针类型变量定义语句格式如下: 类型*变量名; 这里的*是一个定义变量为指针的说明符,而不是指针变量的 部分
6.1.1 指针的概念 按变量的地址直接存取变量的方法称为“直接访问”方式。存贮 变量的内存空间的首地址称为该变量的地址。 如果将一个变量的地址放在另一个变量中,则存放地址的变量称 为指针变量。这样存取变量,也可以间接的由指针变量取得该变 量的地址进行,称为“间接访问”方式。由于指针变量中的值是 另一个变量的地址,我们习惯上形象地称为指针变量指向该变量。 指针变量中的值也简称为指针,所以指针就是地址。 指针类型可以按它指向的变量的类型区分。 指针类型变量定义语句格式如下: 类型 *变量名; 这里的*是一个定义变量为指针的说明符,而不是指针变量的一 部分
612指针变量的赋值、初始化与简单用 &”取地址运算符。作用于内存中一个可寻址的 数据(如:变量,对象和数组元素等等),操作 的结果是获得该数据的地址。 “*”间接引用( dereference)运算符,作用于 个指针类型的变量,访问该指针所指向的内存 教据 D
6.1.2 指针变量的赋值、初始化与简单应用 “&”取地址运算符,作用于内存中一个可寻址的 数据(如:变量,对象和数组元素等等),操作 的结果是获得该数据的地址。 “*”间接引用(dereference)运算符,作用于 一个指针类型的变量,访问该指针所指向的内存 数据
612指针变量的赋值、初始牝蜀简单泫用 例61】指针赋值实例: age1 include 18 using namespace std p age void main(t int age1=18, age2=20, *p_agei age2 page=8agel;/情况1,见图61 20 cout<< age of wang ping is"<<*p age<<endl; p_age=&age2;//情况2,指针改指另一变量,见图61 cout<< age of zhang ling is" <<*p age<<endi D
6.1.2 指针变量的赋值、初始化与简单应用 【例6.1】指针赋值实例: #include using namespace std; void main(){ int age1=18,age2=20,*p_age; p_age=&age1; //情况1,见图6.1 cout<<"age of wang ping is"<<*p_age<<endl; p_age=&age2; //情况2,指针改指另一变量,见图6.1 cout<<"age of zhang ling is"<<*p_age<<endl; 20 age2 18 age1 p_age
612指针变量的赋值、初始化蜀简单泫用 请看以下几个指针使用的例子: int*p a,k=5; p=&k //合法,p指向k g=p /合法,p和q都指向k p=0 /合法,p悬空 p=&5 /非法,常量不可寻址 p=(int*)0x2700//不允许直接干预内存分配 D
6.1.2 指针变量的赋值、初始化与简单应用 请看以下几个指针使用的例子: int *p,*q,k=5; p=&k //合法,p指向k q=p //合法,p和q都指向k p=0 //合法,p悬空 p=&5 //非法,常量不可寻址 p=(int *)0x2700 //不允许直接干预内存分配
6this指针 在上一小节,我们讨论了指向对象和结构变量的指针。 当我们在对象的外部访问该对象的公有成员时,必须指 明是哪一个对象。但是当我们用对象的成员函数来访问 本对象的成员时,在成员函数中只要给出成员名就可以 实现对该对象成员的访问。再进一步可用同一个类创建 很多个对象,但它们共用同一份成员函数的拷贝。既然 是同一份拷贝,那么成员函数又怎么知道是取哪一个对 象的成员数据呢?其实当调用一个成员函数时,系统自 动产生一个隐藏的指针,这个指针称为this指针,它始 终指向产生这个调用的对象,并将该指针作为一个参数 自动传递给该成员函数。这就是说,成员操作符总是要 使用的,只不过在对象内是隐式的,而在对象外是显式 的。即在对象内省略了this指针
6.2 this 指针 在上一小节,我们讨论了指向对象和结构变量的指针。 当我们在对象的外部访问该对象的公有成员时,必须指 明是哪一个对象。但是当我们用对象的成员函数来访问 本对象的成员时,在成员函数中只要给出成员名就可以 实现对该对象成员的访问。再进一步可用同一个类创建 很多个对象,但它们共用同一份成员函数的拷贝。既然 是同一份拷贝,那么成员函数又怎么知道是取哪一个对 象的成员数据呢?其实当调用一个成员函数时,系统自 动产生一个隐藏的指针,这个指针称为this指针,它始 终指向产生这个调用的对象,并将该指针作为一个参数 自动传递给该成员函数。这就是说,成员操作符总是要 使用的,只不过在对象内是隐式的,而在对象外是显式 的。即在对象内省略了this指针
62this指针 实际上编译器是这样实现this指针的 1.改变类成员函数的定义,用附加参数this指针来定义每个成员函数。如: void Goods: Register Goods(Goods*this, char nam, int amount, float price)t strcpy ( this->Name, name);this->Amount=amount; this->price=pricei } 2.每个类成员函数的调用,加上一个附加的实参被调用对象的地址。 如 Car1. Register Goods( String, number, pr )i 改变为: Register Goods(& Car1, String, number, pr) D
6.2 this 指针 实际上编译器是这样实现this指针的 1.改变类成员函数的定义,用附加参数this指针来定义每个成员函数。如: void Cgoods::Register Goods(Cgoods*this,char*nam,int amount,float price){ strcpy(this->Name,name);this->Amount=amount; this->price=price; } 2.每个类成员函数的调用,加上一个附加的实参——被调用对象的地址。 如: Car1.RegisterGoods ( String , number , pr ); 改变为: RegisterGoods ( &Car1 , String , number , pr);
63数组与指针 6.3.1数组与数组元素 6.3.2数组名、指针和指针运算 6.3.3指针、数组名作为函数参数 6.3.4字符串处理 D
6.3 数组与指针 6. 3. 1 数组与数组元素 6. 3. 3 指针、数组名作为函数参数 6. 3. 2 数组名、指针和指针运算 6. 3. 4 字符串处理
631数组与飘组元素 数组的应用是非常广泛的,在数据结构中称为线性表(list),下 面我们看一个对数组最简单的操作。 【例63】找出一个整型数组各数组元素中的最大数和最小数, 数组中的数由随机数函数 rando产生 程序EX63cpp D
6.3.1 数组与数组元素 数组的应用是非常广泛的,在数据结构中称为线性表(list),下 面我们看一个对数组最简单的操作。 【例 6.3】找出一个整型数组各数组元素中的最大数和最小数, 数组中的数由随机数函数 rand()产生。 程序Ex6_3.cpp