1.在数组做函数形参时,A[][3]表示一个第二维的角标个数是3的一个数组,传入实参B[i][j]时,j=3,而i能满足函数体里的语句的需要即可。
2.A[i][j]做函数形参时,实参B[m][n]的要求是n=j且m>=i。
3.操作系统不检查数组第一维的边界,但检查 二维及二维以上的边界,或大或小均不行。(针对数组作函数实参的情况)
char *n;
n="abc";
cout<<n<<endl;
此时输出的内容是:abc
5.void类型的指针可以存放地址,但是不能通过void类型的指针去间接访问一个对象,想要访问此对象,需要经过强制类型转换,然后用另一个类型适合的指针去访问。
6.任何指针的值都可以赋给void指针,但除 void之外的指针之间的赋值都要求类型一致
7.对于数组的元素,其书写格式的本质就是“ 地址[元素]”,其中的“地址”不仅可以是数组名,还可以用其它的东西代替(例如指针,当然,得保证地址对应一致)。如举
例:
int a0[3]={11,12,13};int a1[3]={21,22,23};
int*p[2];
p[0]=a0;
p[1]=a1;
cout<<p[0][0]<<endl;
cout<<p[1][1]<<endl;
输出结果:前者为11,后者为22.对于多维数组,这里拿二维数组b[2][2]中的元素b[0][1]为例,b[0]是地址,[1]为元素。有点类似于子目录。
int*p;
p=(int*)0xaf80;
注意,类似0018FF44的地址不符合要求,不能直接赋给指针,应该写成0X0018FF44才能 用来通过类型转换后赋给指针。(X大小写均可,无影响。即转换成16进制
数)(这条结论仅用于解决疑问,开发过程中最好别用)
9.int(*p)[3][4]=new int[2][3][4]的结果是在p中储存了数组首元素的地址,但类型为int[3][4]。
10.“浅拷贝”和“深拷贝”是对含有指针类型数据成员的类所说的。即几个不同对象(浅拷贝得到)的指针类型数据成员指向同一内存。例如,P2由P1浅拷贝而来,那么P1
的指针类型的数据成员指向的是哪一块内存P2的指针类型的数据成员就指向哪一内存。
11.访问未赋值的指针极有可能导致程序崩溃。(这里的访问是指对内存产生更改的访问)
12.给字符数组赋初值的时候可以将字符和ASCII码混用。
如:char a[20]={a'',98,99,'d',101,0};
但不能将这两者和整体的字符串常量混用
量。并没有定义类或函数等等。
14.如果没有包含头文件<string>,那么cout<<string类型对象名;是会报错的。(就算包含了头文件<string.h>也是会出现这种情况的)
15.声明了一个指向一个类的对象的指针后, 就算该指针没有被初始化,也是可以调用该类的公有函数的,但如果该公有函数访问了该类的数据成员(由于指针没被初始化,所
以数据成员没被初始化)则会导致程序崩溃,不过编译时不会报错。
16.对于一个三维数组a[2][2][2],其中a、 a[...]、a[...][...]都是指向相应下一级首元素的指针。当然a[...][...][...]就不是指针了。
17.数组的...[a]的意义就是先偏移a然后取*
18.string类的对象的类型据对不是char*类型也就是说strcpy(... , ...)不能传入string的对象。
19.当char*p=0;时cout<<p;在编译和链接时不会报错,但运行时会使程序出错。
20.声明引用之后必须初始化。