在今天开始之前,一直以为C++有什么鬼好复习的,然后看了下班群好像别人都在复习得很认真的样子。然后我就看了一下习题。挖槽,好多不会- -!现在开始:
一.指针数组和数组指针。
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
定义char *p[10];
数组指针:a pointer to an array,即指向数组的指针
定义char (*p)[10];
区别:比如说上面那2个,指针数组定义了就分配了10个指针的内存空间。数组指针定义了之分配一个内存的内存空间。
注意:那么这个东西有什么用呢?
比如如果有int array[3][4];
然后你定义一个int **pointer =a;编译器肯定是会报错的!
所以你要定义int (*pointer)[4]=a;就可以啦。
为什么会这样说起来就很复杂了,这里面涉及到指针怎么读所指对象的和对象在内存中的表示。(是吧)
二.转义字符
前面带 '\' 的字符。
八进制表示:\ddd 3位八进制表示字符ASCII码。
十六进制表示:\xhh x后面接2位十六进制来表示字符ASCII码。
三.strcpy函数
拷贝字符串,然后在字符串后面加'\0';
本来也被什么好说的,但是它的鬼考题居然这样出:
char str1[]="how are you";
char str2[11],*p;
strcpy(p=str2,str1);
这个选项是正确的,但是str2明明只分配了11个空间,最后一个'\0'字符无法加上去的啊!
最后经过种种分析,各种实验,我得出了一个结论:
所谓分配空间,就是char str[11];这种。应该是告诉内存,给我一个正常的地址,然后这个地址后的11个单位,如果不是程序员自己去改,里面的东西就不会变。strcmp函数可不知道这些,他就直接在str+11这个地址里面的值补0了。
但是,程序在变化的时候,内存里的东西是会一直变的,就是说,str+11的0非常有可能会被覆盖。
所以在自己编程的时候,千万不要犯这种错误!
四.共用体
这个鬼东西课堂上讲都没讲。(或许是我没听?)
就是所有成员共用一个地址,只有一个成员有效。共用体大小取决于最大成员的大小。
然后他粗题这样粗- -!
union a{int i,char ch;}
a.i=266;
问ch的值为多少?
然后我想了好久.......
266二进制表示为100001010
整形数的表示在32位上计算机上4个字节,忽略前面若干个0。然后char 只有一个字节,一个字节8位。所以只是读后面那8位,得出来是00001010,转化为十进制也就是10。
答对了啦啦啦!
五.总结
学得还太少,很多内存方面的深入知识没有掌握,而指针是操作内存很好的手段,因此导致指针也学得不太好。指针学得不太好C就学不好了- -!