一/ 数组
初始化: 应该完整书写各个元素的构造函数及成员数据初值:
CGoods goods[3]={
CGoods("夏利2000",30,98000.0), //调用三参数构造函数,初始化goods[0]
CGoods("桑塔纳2000",164000.0), //调用两参数构造函数,初始化goods[1]
CGoods() //调用默认的构造函数,初始化goods[2]
};
【例5.2】字符数组与字符数组相连接。
#include <iostream>
using namespace std;
void strcat(char s[],char ct[]){
int i=0,j=0;
while (s[i]!=0) i++;
while (ct[j]!=0) s[i++]=ct[j++];
s[i]='\0';
}
int main (void){
char a[40]="李明";
char b[20]="是东南大学学生";
cout<<a<<endl;
cout<<b<<endl;
strcat(a,b);
cout<<"字符串连接后:"<<endl;
cout<<a<<endl; //打印字符数组a
return 0;
}
二、指针与地址
通过存储单元的地址来使用该存储单元,这就需要有表示存储单元地址的量——指针型变量。例如:
int *ip; // ip是一个指针(变量)
ip=&y; // ip是存储空间y的地址
cout<< ip<< &y<< y<< *ip; //结果?
取地址运算符& :作用于内存中一个可寻址的数据(如变量、对象和数组元素等等),操作的结果是获得该数据的地址。
间接引用运算符* :作用于一个指针类型的变量,访问该指针所指向的变量。例如:
int a=5, *pointer;
pointer=&a; //pointer指向a
*pointer=10; //间接访问,相当于a=10
指针变量的赋值、初始化与简单应用
◆ 1、对指针赋值
对指针赋值有三种情况 :
-
- 取变量地址:使指针指向该变量。
- 指针相互赋值:使两指针指向同一变量。(查看动画演示)
- 指针赋NULL:空指针,指针悬空。不同于指针未赋值。
- 取变量地址:使指针指向该变量。
注意:不能给指针变量随意赋一个地址值,只能取一个已经分配了内存的变量的地址赋给指针变量。变量或对象的内存地址是由编译系统来分配的。
2、指针变量初始化
例如: int age , *p_age=&age; //p_age初始化为指向整型量age。
任何类型指针都可以赋以0值(NULL),称空指针,表示该指针不指向该类型的任何一个变量(对象)。注意不是指向地址为0的内存空间。
3、指针使用时注意
-
- 指针类型可以强制转换,有特殊应用,例如:
int m, *pm=&m;
char *p1=(char*)&m, *p2=(char*)pm;
用pm读的是整型数,用p1,p2读的是整型数的第一个字节。 - 同类型的指针可以相互赋值,如有说明:
int val1=18, val2=20, *p_val1=&val1, *p_val2=&val2;
// p_val1指向val1,p_val2指向val2
执行 p_val1=p_val2; 后,则p_val1也指向val2,而没有指针指向val1了。(查看动画演示) - 必须谨慎使用指针,一旦使用不当会产生灾难性的后果。
例如,局部指针变量在定义时其中的值为随机数,即指针指向了一个无意义的地址,也可能偶然指向了一个非常重要数据的地址。如果对所指的内存进行不当操作,其中的数据就丢失了。
再如,全局指针变量,原指向一个局部变量,后来该内存又重新分配了,我们再对该指针所指地址进行操作,同样会发生不可预知的错误。 - 对指针变量决不可以任意赋一个内存地址,结果甚至是灾难性的。如:
int *P=(int *)0xaf80;
把指针变量P的初始置为0xaf80,我们并不知道那个内存单元放的是什么数据,这在一般程序中是非常危险的。 - 如果通过指向对象或结构变量的指针变量来访问其公有成员时,则只要在指针变量名后加箭头号(箭头操作符“->”),再加公有成员名就可以了
- 指针类型可以强制转换,有特殊应用,例如: