C经典题型

1.
    struct node
    {
            char a[10];
            int b;
    } p[4];

A p->b=2        B  p[0].a="abc" (把字符串赋给地址)     C  p[0]->b=2        D  p->a='b'
正确:p[0].b=1;    
错误:p.b=1;              B和D一样错误
            可以char a[10]="bbb"  但不能 char a[10];  a="bbb"; (a为数组地址)


 2.
    int a,b;
    b=sizeof(a); 
在编译阶段就完成了 
但int a, b, c=9    a=b=c; 不是在编译时确定


3.
#include <stdio.h>
int main()
{
 struct node              
           {
                 
char a;
 int *b;
                 int c;
int d;
    } p;
          printf("%0x\n",&(p.a));
         printf("%0x\n",(p.b));
printf("%0x\n",&(p.c));
        printf("%0x\n",&(p.d));
}  

 
本地图片,请重新上传图片
b是指针,地址不确定, 若改为: printf("%0x\n",&(p.b));   输出为:12ff74
结构体和输出一样,所有元素一起分配,而不是一个一个入栈。  在栈里面顺序;a->b->c->d  地址:低->  高 
地址12ff7c是最高地址(不变),若还加入元素,则地址 从12ff70 减少

 
4.
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);
printf("%d%d\n",*(a+1),*(ptr-1));
}
 答案:2    5
&a表示整个数组的地址 ,&a + 1表示向后偏移整个数组的长度 + 5(若为int a[10] ={1,2,3}  则+10)
若改为: int *ptr = (int *) ((int  *)a+1);   则为: 2   1
若改为:int *ptr = (int *)((int  )a+1);      则为一个很大的正整数
若改为:int *ptr = (int *)((int  )a+4);      则为:2     1(因为(int)a+4实际上就是多加了一个指针偏移的大小,32位系统中指针占用4字节

本地图片,请重新上传

5.
#include <stdio.h>
int main()
{
char a[5] = "abcde";          //溢出
printf("%s\n",a);
printf("%c\n",a);
printf("%x\n",a);
printf("%c\n",*a);
}
图片
#include <stdio.h>

int main()
{
int i = 0x12ff78;   //注意16进制表示,强制转化为char型,只和最后一个字节(78)有关。
char a = (char)i;
printf("%c\n",a);
}                         //输出:x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值