整理笔记 day1

                                                                                                                                                                                         温馨提示:答案及解析在后面 

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 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值