笔试训练1 知识点整理
static關鍵字的作用:
(1)設置局部變量的存儲域,static局部變量的作用范圍為該函數體,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;
?(只執行一次,延長局部變量的聲明周期直至程序結束)
(2)限制全局變量的作用域,static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)限制函數的作用域,static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;
局部變量和全局變量是否可以重名:
?能, 局部會屏蔽全局. 要用全局變量, 需要使用"::"
?
程序的內存分配:
代碼段,數據段(數據區、bss),堆,棧
注:數據區:初始化的全局變量
?bss:靜態變量和未初始化的全局變量/初始化為0的
?
堆和棧的區別:
一、堆棧空間分配區別:
?1、棧空間:由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧;
2、堆空間: 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
二、堆棧緩存方式區別:
?1、棧使用的是一級緩存, 他們通常都是被調用時處于存儲空間中,調用完畢立即釋放;
?2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調用?這些對象的速度要相對來得低一些。
三、堆棧數據結構區別:
堆(數據結構):堆可以被看成是一棵樹,如:堆排序;
棧(數據結構):一種先進后出的數據結構。
程序閱讀題:
#include<stdio.h>
#include<string.h>
int inc(int a)
{
return(++a);
}
int multi(int*a, int *b, int*c)
{
return(*c = (*a) * (*b));
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*, int*, int*);
void show(FUNC2(fun), int arg1, int*arg2)
{
FUNC1 *p = &inc;
int temp = p(arg1);
fun(&temp, &arg1, arg2);
printf("%d\n",*arg2);
}
int main()
{
int a;
show(multi, 10, &a);
return 0;
}
答案:110
#include<stdio.h>
#include<string.h>
void test2()
{
char string[10], str1[10];
int i;
for(i = 0; i < 10; i++)//i < 9
{
str1 = 'a';//錯誤:賦值時類型不兼容
}
//string[10] = '\0';
strcpy(string, str1);
printf("%s\n",string);
}
int main()
{
test2();
return 0;
}
修改的方法:
紅色標識處
編程題:
寫一個函數,判斷單鏈表是否存在環:
struct??listtype??
{??
????int?data;??
????struct?listtype?*?next;??
}list; ?
int?find_cicle(list?*head)??
{??
?????list?*pFast=head;??
?????list?*pSlow=head;??
?????if?(pFast==NULL)??
?????{??
??????????printf(“鏈表是空的\n”);
?return -1;
??????}??
?????while(pFast?&&?pFast->next)??
????{??
????????pFast=pFast->next->next;??
????????pSlow=pSlow->next;??
????????if?(pFast==pSlow)??
???????{??
??Printf(“鏈表存在環!~\n”);
???????????return?1;??
????????}??
?????}??
?Printf(“鏈表不存在環!~\n”);
?????return?0??
}?
N個人排成一圈,順序排好,從第一個開始報數(1-3),凡是報的3的退出圈子,問最后剩下哪個?#include <stdio.h>
int main()
{
int a;
int i,j=0;
int count = 0, x = 0, all = 1;
printf("請輸入人數:\n");
scanf("%d",&a);
x = a;
int b[x][2];
for(i = 0; i < x; i++)
{
b[i][0] = i+1;
b[i][1] = 1;
}//初始化
while(1)
{
if(b[j%x][1] == 0)
{
j++;
continue;
}
count++;
if(count%3 == 0)
{
b[j%x][1] = 0;
count = 0;
++all;
}
j++;
if(all == x)
{
break;
}
}//去除死亡者
for(i = 0; i < x; i++)
{
if(b[i][1] == 1)
{
printf("幸存者是%d ",i+1);
}
}
printf("\n");//輸出幸存者
return 0;
}
總結
以上是生活随笔為你收集整理的笔试训练1 知识点整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PCB第二节知识整理
- 下一篇: 异或方式找到一组数组中不重复的两个数(同