小的c程序解释,持续更新中.......................

今天上班,事情不是很多了,就在网上看到几个c语言的测试题,感觉有点意思,就拿来分析下,我在VS2008下编译验证了

想大概写下解释,都是自己的理解,希望大家指正,因为我也不太会

第1题:
#include<stdio.h>

main()

{
  struct node{int a;int b;int c;};

struct node s={5,7,9};
  
struct node *pt=&s;

printf("%d",*pt);
}

这个主要考察,结构体指针,我只认识那个取地址的符号&,将指针pt指向结构体 s 的首地址,打印时,只打印1个整型数,所以就输出 5 了

如果打印语句换为printf("%d  %d",*pt);打印结果就是 5  7了,之后大家就懂了吧


第2题:
#include<stdio.h>

 main()

 {
   char p;
     char buf[10]={1,2,3,4,5,6,8,9};
      p=(buf+1)[5];
   printf("%d",p);

 }

这里主要是考察这里p=(buf+1)[5];我之前从未见过这种用法,这次验证了下,猜了下他的作用,不知道是否是自己理解的

输出结果:8,p=(buf+1)[5];       换为p=(buf-1)[5];输出 5   ,大家也懂了吧,前面括号里  加减 多少就相当于在  [ ]里面对5 加减多少

我也不清楚为什么要这样做


第3题
#include<stdio.h>

int counter(int i)

{

  static int count=0;
  
    count=count+i;
 
    return count;
}

main()

{
  int i,j;

for(i=0;i<=5;i++)

 j=counter(i);

printf("%d",j);
 
}
这段程序的输出:15

这里就是考察static的作用,static int count=0; 换成int count=0;  输出结果就是  5  


通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

  但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
  静态局部变量正好可以解决这个问题。 静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
  静态局部变量有以下特点:
  该变量在全局数据区分配内存;
  静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的 函数调用 不再进行初始化;
  静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

第4题
#include<stdio.h>

void f(char **);

main()

{  

char *argv[]={"ab","cd","ef","gh","ij","kl"};

  f(argv);

}

void f(char **p)


char *t;
  
t=(p+=sizeof(int))[-1];
printf("%s",t);

}

这段程序的输出:gh     其实这道题和  第2题是一样的     sizeof(int)=4    最后输出   t=(p+4)[-1]=p[-1+4]=p[3]

第5题
#include<stdio.h>

void foo(int [][3]);

main()

{
 
  int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

  foo(a);
  
  printf("%d",a[2][1]);

 
}

void foo(int b[][3])

{
 
    ++b;
 
    b[1][1]=9;

}

这段程序的输出:9   

执行完   foo(a);   打印a={{1,2,3},{4,5,6},{7,9,9}};      本来是 b[1][1]=9,结果行数被加1,变为b[2][1]=9;

如果将  ++b; 改为 --b;   a={{1,9,3},{4,5,6},{7,8,9}};    本来是 b[1][1]=9,结果行数被减1,变为b[0][1]=9;

如果删掉    ++b;                a={{1,2,3},{4,9,6},{7,8,9}};       本来是 b[1][1]=9

二维数组就是数组的数组,a[3][3]就是    a包含 3个 int型的 3个数组的数组

至于为什么这样加减,我也不清楚,为什么这样玩,有知道的可以告诉我啊,谢谢了!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值