面试了几家公司,简单面试题,对于我新手第一次朦了!

想当年考C语言证书还是一次过:没有碰到这种题

1、定义两个指针变量:Int *p,*q下面那个是错误___

A p++;

B p=q+5;

C int a=p+q;

D int a=p-q;

注意://指针之间可以相减,但不可以相加:两个同一类型的指针变量是可以相减的,他们的意义表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数),p-q的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。 指针变量的自加和自减实际上是与整数1的加减运算。

2、

int add(int a,int b)

{

return a + b;

}这句话有问题嘛?对于我学java做这个,用了100次,哪里会存在问题呢??当时朦了,吓死我了c语言水太深了!

他当时给我说了内存管理有问题,靠!

3、每家面试题都在考

struct s1 {
    char c;
    short c2;
    char c3;
};

对于第一个当时我给的答案就是1+2+1=4;哈哈太简单了交卷!

尼玛下来查才知道错误了,伤不起啊!面试了那么多家都是这样子做的,陷阱真多,原来内存字节要对齐

参考:http://blog.csdn.net/hairetz/article/details/4084088

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.


struct s1 {
    char c; [0] [1]
    short c2;[2][3] 由于short占两个字节,故c2的地址开始应为2的整数倍,故在c补上[1],c2的起使地址[2]
    char c3; [4] 该结构体最大成员的整数倍,要对齐 [5] sizeof(s1)为6
};


给自己重新出了道题

struct s2{
    char c1; [0]
    char c2; [1]
    short c3;[2] [3].....[7]
    double a;[8].........[15]
    int *p;  [16]........[23]
};

根据上面的1,2,3点sizeof(s2)为24

4、递归法反向输出:



#include 
   
   
    
    
using namespace std;
#define LIST_SIZE sizeof(List)
typedef struct Linearity
{
    int data;
    struct Linearity *next;
}List;
List *create(int size)
{
    List *head,*q,*p;
    if (NULL ==(head=(List *)malloc(LIST_SIZE)))
    {
        cout<<"分配内存空间错误";
        exit(1);
    }
    p=head;
    int i=0;
    while (i
    
    
     
     next=q;
        p=q;
        p->data=i;
        i++;
    }
    p->next=NULL;
    return head;
}
//普通逆序排列
List *reverseList_1(List* head)
{
    if (head->next == NULL || head ==NULL)
    {
        exit(1);
    }
    List *p,*q,*r;
    p=head->next;
    q=p->next;
    
    r=q->next;
      
    p->next=NULL;
    while (q->next!= NULL)
    {
        q->next=p;
        p=q;
        q=r;
        r=q->next;
    }
    q->next=p;
    head->next=q;
    return head;
}
//递归逆序排序
List *reverseList_2(List* head,List *last=NULL)
{
    if (head == NULL)
    {
        //莫名其妙报错 必需加上这个输出语句,这个xcode
        cout<<"head"<
     
     
      
      next;
    head->next=last;
    reverseList_2(p,head);
}
int main(int argc, const char * argv[])
{
    List *q=NULL;
    List *head=create(20);
    //第二个参数默认为NULL,可以不写
     head=reverseList_2(head->next);
     q=head;
    while (q!=NULL) {
       cout<
      
      
       
       data<
       
       
         next; } return 0; } 
       
      
      
     
     
    
    
   
   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值