温馨提示:答案及解析在后面
1、在32位小端的机器上,如下代码输出是什么:
char array[12]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
sort *pshort=(short*)array;
int *pint =(int*)array;
int64*pint64=(int64*)array;
printf("0x%x,0x%x,0x%11x,0x%11x",*pshort,*(pshort+2),*pint64,*(pint+2));
2、下面这段代码输出的是:
#include<stdio.h>
int mian()
{
printf("\n");
int a[5]={1,2,3,4,5};
int *p,**k;
p=a;
k=&p;
printf("%d ",*(p++));
printf("%d ",**K);
return 0;
}
答:
3、在C/C++中,若有定义char a[10],*p=2; 那么下列赋值语句正确的是()
A.a[ ]="abcde";
B.a="abcde";
C.*p="abcde";
D.p="abcde";
4、下面指针所指向的内存,可以修改的是()
A.const int* a
B.int const* b
C.int *const c
D.const int *const d
5、下面程序的输出结果;
int mian()
{
int i=0,s=0;
for(; ;)
{
if(i==3||i==5) continue;
if(i==6) break;
i++;
s+=i;
}
printf("%d\n",s);
return 0;
}
6、若有C语言表达式2+3*4+7/3,正确的执行顺序是——
7、在32位编译器,设有定义 char*str1="hello",str2[ ]="hello"; 则以下语句printf("%d %d",sizeof(str1),sizeof(str2));的输出结果为
答案:
8、对于32位机器,则下面代码输出结果为——
#include<iostream>
#include(string>
using namespace std;
typedef struct data
{
int a[10];
}data_t;
typedef struct descriptor
{
data_t*ptr;
char data[0];
}desc_t;
int mian()
{
cout <<sizeof(desc_t) <<endl;
return 0;
}
9、malloc 函数进行动态、静态内存分配是在什么阶段?()
A.编译阶段
B.链接阶段
C.装载阶段
D.执行阶段
10、下列main()函数执行的结果是()
int mian()
{
int cent=0;
while(value)
{
cent++;
value=value&(value-1);
}
return cnt;
}
void main()
{
printf("%d",fun(65535));
}
答案及解析
1、0x201,0x605,0x807060504030201,0x0
小端机器的数据高位字节放在高地址,低位字节放在低地址
char------1字节,0x08-07-06-05-04-03-02-01(从后到前下标为0-7)
short-----2字节,0x0807-0605-0403-0202(从后到前下标为0-3)
*pshort从0开始,所以0x21
*(pshort+2)从2开始,所以0x605
int64------8字节,0x0807060504030201(从后到前下标为0)
*pint64从0开始,所以0x08070605-04030201(从后到前下标为0-1)
*(pint+2)从2开始,但是最多只到下标1,后面位置默认为0
2、1 2
p存放的是a的地址
k存放的是p指针的地址,p++, p指针存放的内容变了,k的指向没有变,但是k的值变了
*p++<=>*(p++)都是先取p指向的值,再让p指向下一个位置
3、D
将字符串赋值给字符数组
①定义时直接用字符串赋值,char a[10]="hello";但不能先定义再赋值,以下非法:char a[10];a[10]="hello";
②利用strcpy 。char a[10] ; strcpy(a,"hello");
③利用指针。char*p ; p="hello";这里字符串返回首字母地址,
赋值给指针p
另外以下非法:char a[10] ; a="hello"; a已经指向在堆栈中,分配的10个字符空间,不能再指向数据区中的"hello"常量,
可以理解为a是一个地址常量,不可变,p是一个地址变量
4、C
当 const 在* 的左边,则为常量指针,不能改变指针的对象的值=指针所指向的内存;当const在*的右边,指针常量,不能改变指针的地址
5、 程序进入死循环
continue,终止最近的循环中的当前迭代并立即进入下一次迭代,因此当i=3时,终止此次循环并进行下一次循环,而这个过程中i的值一直未发生变化,所以会陷入死循环
6、先执行3*4得12,再执行2+12=14,再执行7/3得2,最后执行14+2得16
首先,在C语言中,乘除法优先级要高于加减法,其次,除法运算符“/”两边参加运算对象都是整数,运算结果要取整,因为运算符*和/都满足从左到右的运算规则,故应先计算3*4=12.
7、4 6
字符指针:sizeof为4,str2为字符数组,包含6个字符
8、4
data[0]的长度为0,字节为0,在win32编译器下指针长度为4,总长度为4,不需要对齐,所以结构体长度为4
9、CD
10、16
x|(x+1)统计x二进制数中0的个数
x&(x-1)统计x二进制数中1的个数
values=65535二进制;1111 1111 1111 1111
values=65534 : 1111 1111 1111 1110