A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 10324|回复: 6

美版DQS的50个小金币换的东西不是加必杀啊??

[复制链接]
该用户已被禁言

流放者(禁止发言)

我事におゐて後悔をせず

精华
0
帖子
961
威望
0 点
积分
1398 点
种子
0 点
注册时间
2006-7-14
最后登录
2019-12-8
 楼主| 发表于 2008-7-6 15:44  ·  天津 | 显示全部楼层 |阅读模式
好像是加血的。。。。美版什么物品能加必杀槽累计速度?.

精华
10
帖子
150939
威望
13 点
积分
168890 点
种子
42 点
注册时间
2004-12-17
最后登录
2024-11-21
发表于 2008-8-3 18:35  ·  北京 | 显示全部楼层
反正日版50个是换必杀槽能量快速增加的戒指 美版应该一样吧!!!
该用户已被禁言

精华
0
帖子
262
威望
0 点
积分
195 点
种子
0 点
注册时间
2007-11-12
最后登录
2016-3-22
发表于 2009-12-2 12:03  ·  广东 | 显示全部楼层
44.int (* (*f)(int, int))(int)表示什么含义?
a function pointer
it points to a function that takes two arguments and return another function pointer that is
"int (*)(int)"
45.x=x+1,x+=1,x++,为这三个语句的效率排序。并说明为什么。
46.中缀表达式 A-(B+C/D)*E的后缀形式是什么?
47.struct S1
{ char c;
int i;
};
sizeof(S1) = ?
class X{
public:
X();
virtual ~X();
void myMemberFunc();
static void myStaticFunc();
virtual void myVirtualFunc();
private:
int i;
char * pstr;
char a;
}
sizeof(X) = ?
48.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"

#include "stdio.h"
char *maxsubstr(char *str1, char *str2)
{
char *p1, *p2, *q1, *q2, *destp;
char *substr;
int max = 0, len;
p1 = str1;
while (*p1 != '')
{
  q1 = str2;
  while (*q1 != '')
  {
  len = 0;
  p2 = p1; q2 = q1;
  while ((*p2 != '') && (*q2 != ''))
  {
   if (*p2 == *q2)
   {
    p2++; q2++; len++;
   }
   else
    break;
  }
  if (len > max)
  {
   max = len; destp = p1;
  }
  q1++;
  }
  p1++;
}
substr = (char *)malloc(sizeof(char)*max);
strncpy(substr,destp,max);
return substr;
}
int main(){
char *s1 = "asdfghjkl";
char *s2 = "asdwfghjews";
char *sub;
printf(" %s %s", s1, s2);
sub = maxsubstr(s1, s2);
printf(" the max sub string is: %s", sub);
return 0;}

49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.
void hundurd(int a[],int n)
{
     long result = 0;
     int temp1  = a[0] + a[1] + a[2];
     int temp2;
     result = temp1;
     for (int i = 2;i < n;i ++)
     {
          temp2 = temp2 - a[i - 2] + a [i + 1];
          if (temp2 > temp1)
          {
              result = temp2;
          }
          temp1 = temp2;
     }
     return result;
}
50.写一程序实现快速排序. 假设数据输入为一文件
快速算法描述如下
Algorithm Partition
Input: sequence a0, ..., an-1 with n elements
Output: permutation of the sequence such that all elements a0, ..., aj are les
s than or equal to all
elements ai, ..., an-1 (i > j)
Method:
choose the element in the middle of the sequence as comparison element x
let i = 0 and j = n-1
while ij
   search the first element ai which is greater than or equal to x
   search the last element aj which is less than or equal to x
   if ij
   exchange ai and aj
   let i = i+1 and j = j-1
After partitioning the sequence, Quicksort treats the two parts recursively by
the same procedure.
The recursion ends whenever a part consists of one element only.
51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),
要求算法复杂度(Algorithm&#39;s complexity是O(n)) 并只使用常数空间(space is O(c)).
注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.(MOTO)
答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;  当p2 指针追上 p1的时候,就表明链表当中有环路了。
int testLinkRing(Link *head)
{
  Link *t1=head,*t2=head;
  while( t1->next && t2->next)
  {
     t1 = t1->;next;
        if (NULL == (t2 = t2->next->next))
          return 0;  //无环
        if (t1 == t2)
          return 1;
    }
  return 0;
}
如果要定位环路在链表当中的开始点
发现p2和p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1和p2再次相遇的时候,就是环路的入口了。

52.设下列函数已经通过了调试
bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);
该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。
请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:
输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。
输出:排序后的大文件char * poutoutfilename。
53.用最有效率的方法算出2乘以8等於几?
移位
54.选择题
1.错误的转义字符是 (a )
A.&#39;091&#39; B.&#39;&#39;
C.&#39;0&#39; D.&#39;&#39;&#39;
String s=""";  //s="   char c=&#39;&#39;&#39;; //c=&#39;  是转移字符
2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是 (d )
A.数组的长度 B.数组第一个元素的值 C.数组所有元素的值 D.数组第一个元素的地址
3.变量的指针含意是指变量的 (b )
A.值  B.地址 C.存储  D.名字
5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (d )??
A.只限某个函数 B.本文件C.跨文件 D.不限制作用域
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
55.
该用户已被禁言

精华
0
帖子
262
威望
0 点
积分
195 点
种子
0 点
注册时间
2007-11-12
最后登录
2016-3-22
发表于 2009-12-2 12:04  ·  江苏 | 显示全部楼层
1. 解二次方程:a*x*x+b*x+c
int Quadratic( double a,double b,double c,double& x1,double& x2);
返回值:解的个数 用求根公式计算
2. 最大公约数
DWORD Divisor( DWORD dwFirst, DWORD dwSecond );
返回值:最大公约数
long Divisor( long dwFirst, long dwSecond )
{
    if (dwFirst < dwSecond)
    {
        long temp = dwFirst;
        dwFirst = dwSecond;
        dwSecond = temp;
    }
    if (dwSecond == 0)
    {
        return dwFirst;
    }
    if (dwFirst % 2 == 0)
    {
        if (dwSecond % 2 == 0)
        {
            return(Divisor(dwFirst >> 1,dwSecond >> 1) > 1,dwSecond);
        }
    }
    else
    {
        if (dwSecond % 2 == 0)
        {
            return Divisor(dwFirst,dwSecond >> 1);
        }
        else
        {
            return Divisor(dwSecond,dwFirst - dwSecond);
        }
    }
}
3. 根据蒙特卡洛算法计算圆周率
double PI( DOWRD dwCount/*测试次数*/ );
返回值:PI
/**//*
利用蒙特卡洛算法近似求圆周率PI
VC++6.0
ZZH
*/
#include
#include
#include
#define COUNT 500000 //循环取样次数
using namespace std;
bool InCircle(double x,double y)//是否在1/4圆范围之内
{
   if((x*x+y*y)data=e;
  s->prior=p;
  p-> next -> prior =s;
p->next=s;  
s->next=p->next->next;  
  return OK;
}

6  写一个函数,将其中的t都转换成4个空格。
include   
  #include   
  using  namespace  std;  
   
  int  main()  
  {   
       string  s="dasfastfdasfsdaftdfsdfa";  
  int  c=0;  
  while((c=s.find("t",c+1))!=string::npos)  
  {  
  s.replace(c,1,"      ");  
  }  
  coutnext = head;
head = ps;
ps = pe->next;
}
}
从第一个元素开始,ps指向他,将他(ps)指向头节点(ps->next = head),将ps设为头节点(head = ps;)操作下一个元素(ps = pe->next;)等于是依次将每个元素翻到原头节点前面。
15 设计一个重采样系统,说明如何anti-alias
16 某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)中运行,还需要优化吗?
.对排序算法的总结:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
 快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
 堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的
17. 下面哪种排序法对12354最快
a quick sort
b.buble sort若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
c.merge sort
18. 哪种结构,平均来讲,获取一个值最快
a. binary tree
b. hash table
c. stack
19 请问C++的类和C里面的struct有什么区别?
class中默认的成员访问权限是private的,而struct中则是public的
20 请讲一讲析构函数和虚函数的用法和作用?
析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 有释放内存空间的作用。
虚函数是C++多态的一种表现, 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
21 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁  
局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 内存中分配在全局数据区
使用方式不同:通过声明后全局变量程序的各个部分都可以用到  
             局部变量只能在局部使用;分配在栈区
操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。
22 一些寄存器的题目,主要是寻址和内存管理等一些知识。
23 8086是多少位的系统?在数据总线上是怎么实现的?
24 多态。overload 和 override的区别。
overload是重载,重载是一种参数多态机制,即代码通过参数的类型或个数不同而实现的多态机制。 是一种静态的绑定机制(在编译时已经知道具体执行的是哪个代码段)。  
override是覆盖。覆盖是一种动态绑定的多态机制。即在父类和子类中同名元素(如成员函数)有不同的实现代码。执行的是哪个代码是根据运行时实际情况而定的。
重载Overload特点
public bool withdraw(double amt, string name)
public double withdraw(double amt)
1、方法名必须相同2、参数列表必须不相同3、返回值类型可以不相同
注意:override存在于继继承的关系类中。
覆写Override特点(三相同):
public override bool withdraw(...)
1、方法名相同2、参数列表相同3、返回值类型相同
注意:存在于同一类中,但是只有虚方法和抽象方法才能被覆写.

25.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include
#define N 8
int main()
{ int i;
int j;
int k;
  ---------------------------------------------------------
for ( i = 1;i=temp.value && temp.left!=NULL) || (N=temp.value && temp.left!=NULL)
         temp=temp.left;
    while(N=temp.value)
      temp.left=NewNode;
  else
      temp.right=NewNode;
  return;      
}
}
29. A class B network on the internet has a subnet mask of 255.255.240.0, what is the maximum number of hosts per subnet.
一B类地址的子网掩码是255.255.240.0,问每个子网内的最大主机数
子网掩码与iP相与得到子网号,255.255.240.0化成二进制11111111.11111111.11110000.00000000,即有12个"0",2^12-2=4096-2=4094
a. 240   b. 255   c. 4094  d. 6553
30. What is the difference: between o(log n) and o(log n^2), where both logarithems(对数) have base 2.
a. o(log n^2) is bigger  b. o(log n) is bigger  c. no difference  
31. For a class what would happen if we call a class’s constructor from with the same class’s constructor .
a. compilation error  b. linking error  c. stack overflow   d. none of the above
32. “new”in c++ is a:
A. library function like malloc in c B. key word  C. operator  D. none of the above
malloc是库函数,不在编译器控制范围之内;new是运算符,在编译器控制范围之内。  
调用malloc时,从堆中申请内存;调用new时,从堆中申请内存并为内存调用构造函数。
33. Which of the following information is not contained in an inode  .
a. file owner   b. file size  c. file name  d. disk address
34. What’s the number of comparisons in the worst case to merge two sorted li
sts containing n elements each .
a. 2n        b.2n-1            c.2n+1           d.2n-2
35. Time complexity of n algorithm T(n), where n is the input size ,is T(n)=T(n-1)+1/n if n>1 otherwise 1 the order of this algorithm is     .
a. log (n)  b. n              c. n^2            d. n^n
36. The number of 1’s in the binary representation of 3*4096+ 15*256+5*16+3 a
re  .
a. 8               b. 9               c. 10        d. 12
37.设计函数 int atoi(char *s)。
38.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少?
39.解释局部变量、全局变量和静态变量的含义。
40.解释堆和栈的区别。
在传统的C中堆和栈实际是一块物理内存,堆主要用来动态分配内存,从堆栈内存的低端向上分配;而栈主要用来传递函数参数、返回值和局部参数内存分配,是从堆栈内存的高端向下分配,俗称压栈和出栈;堆是动态分配,比如用new,malloc分配,需要手工释放,不然会导致memory  leak,  
栈是静态分配,比如函数调用是需要分配堆栈,但堆栈能自动释放.
41.论述含参数的宏与函数的优缺点。
宏是编译期的,函数是运行期的;宏不是实体,而函数是一个可寻址的实体;宏只是编译期替换,在程序里每遇到S(a,b),就用a*b代替,a和b两个实体并没有由宏实际产生,而函数S会在栈中定义两个对象a和b。宏没有生存期、作用域之类的概念,而函数就有。
42. 以下三条输出语句分别输出什么?[C易]
char str1[]     = "abc";
char str2[]     = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5  = "abc";
const char* str6  = "abc";
cout
该用户已被禁言

精华
0
帖子
262
威望
0 点
积分
195 点
种子
0 点
注册时间
2007-11-12
最后登录
2016-3-22
发表于 2009-12-2 13:54  ·  江苏 | 显示全部楼层
(慧通)

1 写出程序把一个链表中的接点顺序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//将一个链表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{ r=q->next;
q->next=p;
p=q;
q=r;}
head->next=NULL;
head=p;
return head;
}

2 写出程序删除链表中的所有接点
void del_all(node *head)
{ node *p;
while(head!=NULL)
{ p=head->next;
  free(head);
  head=p;
}
cout=pbFrom+size || pbFrom>=pbTo+size);//检查两个指针指向的内存是否重叠
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}

华为面试题:
怎么判断链表中是否有环?
bool CircleInList(Link* pHead)
{
if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环
return (false);
if(pHead->next = = pHead)//自环
return (true);
Link *pTemp1 = pHead;   //step 1
Link *pTemp = pHead->next;  //step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;  //增量1
pTemp = pTemp->next->next;  //增量2
}
if(pTemp = = pTemp1)
return (true);
return (false);
}

1。编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char * search(char *cpSource, char ch)
{
char *cpTemp=NULL, *cpDest=NULL;
int iTemp, iCount=0;
while(*cpSource)
{
if(*cpSource == ch)
{
iTemp = 0;
cpTemp = cpSource;
while(*cpSource == ch)
++iTemp, ++cpSource;
if(iTemp > iCount)
iCount = iTemp, cpDest = cpTemp;
if(!*cpSource)
break;
}
++cpSource;
}
return cpDest;
}
2。请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
int search(char *cpSource, int n, char ch)
{
int i;
for(i=0; inext,并随后删除原next指向的节点。

#include
void foo(int m, int n)
{
printf("m=%d, n=%dn", m, n);
}

int main()
{
int b = 3;
foo(b+=3, ++b);
printf("b=%dn", b);
return 0;
}
输出:m=7,n=4,b=7(VC6.0)
这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同
编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以
各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。
因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理
这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得
结果。最后是看编译器优化。


2.写一函数,实现删除字符串str1中含有的字符串str2.
第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)


1. 下面这段代码的输出是多少(在32位机上).
   char *p;
   char *q[20];
   char *m[20][20];
   int (*n)[10];
struct MyStruct{
char dda;
double dda1;
int type ;
};
MyStruct k;
printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:4,80,1600,4,24
n是指向一维数组的指针变量;k中不要忘了考虑对齐问题,这里dda为4个字节。
2.
(1)
char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };
for(int i=0;i_next->_next == NULL) return head;
     node* mid= head;

     node* p = mid->_next;
     while ((NULL != p) && (NULL != p->_next))
     {

          mid = mid->_next;
          p = p->_next->_next;
     }

     return mid;
}
7.写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
8.用递归算法判断数组a[N]是否为一个递增数组。
9.
有一个文件(名为a.txt)如下,每行有4项,第一项是他们的名次,写一个c程序,将五个人的名字打印出来.并按名次排序后将5行数据仍然保存到a.txt中.使文件按名次排列每行.

2,07010188,0711,李镇豪,
1,07010154,0421,陈亦良,
3,07010194,0312,凌瑞松,
4,07010209,0351,罗安祥,
5,07010237,0961,黄世传,
10.写一个函数,判断一个unsigned char 字符有几位是1.
  写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).
11.微软的笔试题.
Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).
Please do not use MFC, STL and other libraries in your implementation.
12.有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).
这十道题还是能够看出自己的水平如何的.如果你能不假思索地做出这10道题,估计去国外大公司是没有问题了,呵呵.
答案我在整理中,以后陆续发布.................
下面有些题也不错,可以参考.
1.下面的代码输出是什么,为什么?
     void foo(void)
     {
        unsigned int a = 6;
        int b = -20;
        (a+b>6)?puts(">6"):puts("6.
就是考察隐式转换.int型变量转化成unsigned int, b成了正数.
2. b)运行下面的函数会有什么结果?为什么?
     void foo(void)
       {
          char string[10],str1[10];
          int i;
          for(i=0;i &#39;9&#39;) || (s < &#39;0&#39;))
  break;
  int j = s - &#39;0&#39;;
  result = 10 * result + j;
  i++;
}
result = result * flag;
return result;
}
int main(){
char* a = "  -1234def";
char* b = "+1234";
int i = myAtoi(a);
int j = myAtoi(b);
printf("%d n",i);
printf("%d",j);
return 0;
}


二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 1234560在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 1234560放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。

2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,
这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址
和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大***限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
堆和栈的区别及内存泄露- -
                          
   堆和栈是两个不同的概念。在学微机原理时没有感觉到,因为书上只提到了堆栈;数据结构上也提到过栈。但是,始终不明白什么是堆,什么是栈。后来无意翻看了C++,才知道(只是知道,不是明白,更称不上懂)它们的区别。
   简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。
   由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。
   C/C++是“跨国语言”,在任何平台上都可以使用。所以,Memory Leak在每个系统上都会出现。避免方法就是在写完malloc后,紧跟着就在下一行写free。然后在两行代码中间加其他的代码。哈哈,梁肇新的成对编码,这样会很好的解决。
5.论述含参数的宏与函数的优缺点。
该用户已被禁言

精华
0
帖子
262
威望
0 点
积分
195 点
种子
0 点
注册时间
2007-11-12
最后登录
2016-3-22
发表于 2009-12-2 14:00  ·  江苏 | 显示全部楼层
  1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。
//假设线性表的双向链表存储结构
typedef struct DulNode{
   struct DulNode *prior;  //前驱指针
    ElemType data;   //数据
    struct DulNode *next;  //后继指针
}DulNode,*DuLinkList;
//删除操作
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现
   return ERROR;
  e=p->data;
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);
  return OK;
}
//插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i)))
   return ERROR;
  if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
   return ERROR;

  s->data=e;
  s->prior=p->prior;
  p->prior->next=s;
  s->next=p;
  p->prior=s;
  return OK;
}
2.写一个函数,将其中的t都转换成4个空格。
该函数命名为convert,参数的意义为:
*strDest目的字符串,*strSrc源字符串,length源字符串的长度
函数实现为:
char* convert(char *strDest, const char *strSrc,int length)
{
  char * cp = strDest;
  int i=0;
  while(*strSrc && i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2024-11-21 19:20 , Processed in 0.185020 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部