1、
double dArray[2] = {4, 8}, *p, *q;
p = &dArray[0];
q = p + 1;
cout <<q-p<<endl;
cout << (int)q-(int)p << endl;
输出1,8
第一个是指针加减,按照的是指向地址类型的加减,只跟类型位置有关,q和p指向的数据类型以实际数据类型来算差一个位置,因此是1。而第二个加减是实际指针值得加减,在内存中一个double类型占据8个字节,因此是8
2、栈:由编译器自动分配释放,保存函数的参数值、局部变量等。
堆:程序员分配,若程序员不释放,则系统在程序结束后收回。
全局区(静态区):全局变量和静态变量存储在一起,系统在程序结束后收回。未初始化的全局变量和静态变量放在相邻另一区域。
文字常量区:保存常量字符串,系统在程序结束后收回。
例子:
int a=0; //全局初始化区
char * p; //全局未初始化区
main(){
int b; //栈区
char* p1="1234";//1234/0在常量区, p1在栈区
static int c=0; //全局区
p=(char*)malloc(5); //分配的5字节在堆区
strcpy(p1, "1234"); //1234/0在常量区
}
3、全局变量可以定义在多个头文件中,用static声明,但只能有一个c文件对此变量赋初值。
4、输出结果:
float a=1.0f;
cout<<(int&)a<<endl;
cout<<a<<endl;
其中(int&)a表示将浮点数a当作整型处理,所以注意结果的不同。
5、str***()函数的写法:
a.形参用const修饰;
b.判断指针空值;
c.考虑'/0'
d.返回指针地址;
例子:char* strcpy(char* des, const char* src) {
if((NULL!=des)&&(NULL!=src)) {
char* adress = des;
while('/0' != (*des++ = *src++));
return adress;
}
}
6、输出结果:8,8
int a[ ] = {6,7,8,9,10};
int* p = a;
*(p++) += 123;
printf("%d, %d/n", *p, *(++p) );
7、以下代码是否输出0?
struct A{
int m_i;
A(int i):m_i(1) {}
A() { A(0); }
}
A aa;
cout<<aa.m_i<<endl;
在默认构造函数中再调用代参数的构造函数属用户行为而非编译器行为,亦仅执行函数调用而不执行其后初始化表达式。只有在生成对象时,初始化表达式才会随构造函数一起调用。
8、swap(int* p1, int* p2){
int *p;
*p = *p1; *p1 = *p2; *p2 = *p;
}
其中p为野指针,可能导致系统崩溃,应修改为:
int p;
p = *p1; *p1 = *p2; *p2 = p;
9、除了#ifndef/#define/#endif外,VC中有哪些方法避免C编译头文件重复?
#pragma once
10、32位系统中,出现结构字节对齐的问题和大小端的问题的避免?
#pragma pack(4)
11、main(){
int count=0;
int m=9999;
while(m){
count++;
m=m&(m-1);
}
printf(count);
}
问count输出为多少?
答:把 m 转换为二进制, 输出为这个二进制中 1 的个数
12、把1-100的自然数放到a[99]这个数组里,请用最简单的方法做出1-100之间那个数没有放到a[99]这个数组里。
看到的最简单的算法:1到100相加减去数组相加之和,就是没放到数组里的数
13、unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
printf("%x/n",p1+5);
printf("%x/n",p2+5);