考驗(yàn)基本功的時(shí)刻到了挨稿,各位大大猜猜下面這些code的輸出是什么仇轻?
1 . typedef跟define的區(qū)別?
#define char_d char*
typedef char* char_t;
int main(void)
{
char_d p,q;
printf("sizeof(p)=%dsizeof(q)=%d\\n",sizeof(p),sizeof(q));
char_t x,y;
printf("sizeof(x)=%dsizeof(y)=%d\\n",sizeof(x),sizeof(y));
return0;
}
2 . 內(nèi)存對(duì)齊原則(linux下)叶组?
#pragma pake(8)
struct Student
{
char a; short b; int c; int d; double e;
};
struct Student1
{
char a; double e; short b; int c; int d;
};
union Student2
{
char a; double e; short b; int c; int d;
};
printf("sizeof(t) = %ld \\n",sizeof(struct Student)); // 請(qǐng)問(wèn)輸出什么历造?
printf("sizeof(t1) = %ld \\n",sizeof(struct Student1)); // 請(qǐng)問(wèn)輸出什么甩十?
printf("sizeof(t2) = %ld \\n",sizeof(union Student2)); // 請(qǐng)問(wèn)輸出什么船庇?
3 . 下面代碼作為單鏈翻轉(zhuǎn),有問(wèn)題嗎侣监?
typedef struct node
{
int data;
struct node * next;
} Node;
void reverseList (Node * head){
Node * tmp = head->next;
Node * p;
while (tmp->next) {
p = tmp->next;
tmp->next = p->next;
p->next = head->next;
head->next = p;
}
}
4 . 編寫(xiě)程序:輸入一整數(shù)n,輸入1-n的全排列;
例如:
輸入 3
輸出:123 132 213 231 312 321
5 . 下面代碼輸出:
void question2(){
char a[1000];
int i ;
for(i=0;i<1000;i++){
a[i] = -1-i;
}
printf("%lu \\n",strlen(a)); // 0 截?cái)?}
6 . 下面代碼打印結(jié)果是0鸭轮?
int arr[10][10];
int (* p) [5] ;
p = arr;
printf("%lu \\n", &arr[5][3] - &p[5][3]);
7 . 不使用第三方變量,第三方函數(shù)橄霉,將下面的字符串逆序打印出來(lái)窃爷?
char *p = "234g4jhg21jh3g12jh";
8 . 如何判斷下面單鏈表是否有環(huán)呢?
typedef struct node
{
int data;
struct node *next;
}DNode;
9 . 思考一下姓蜂,下面的代碼輸出幾個(gè)pass按厘?
float f1 = 20.3;
double d1 = 20.3;
if (f1 == d1) {
NSLog(@"pass");
}
float f2 = 20.5;
double d2 = 20.5;
if (f2 == d2) {
NSLog(@"pass");
}
float f3 = 20.6;
double d3 = 20.6;
if (f3 == d3) {
NSLog(@"pass");
}
、 別偷看答案钱慢,自己先好好想想逮京。
、
束莫、
懒棉、
、
览绿、
策严、
、
饿敲、
妻导、
、
诀蓉、
栗竖、
、
渠啤、
狐肢、
、
沥曹、
份名、
、
妓美、
僵腺、
、
壶栋、
辰如、
、
贵试、
琉兜、
凯正、
、
豌蟋、
廊散、
、
梧疲、
允睹、
、
幌氮、
缭受、
答案:
1 . 輸出結(jié)果:
sizeof(p) = 8 sizeof(q) = 1
sizeof(x) = 8 sizeof(y) = 8
提示:沒(méi)有答對(duì)的 可以看看預(yù)處理后的代碼;
gcc -E main.c -o main.i
vim main.i
2 . 輸出結(jié)果:
sizeof(t)=24
sizeof(t1)=32
sizeof(t2)=8
提示:沒(méi)有答對(duì)的浩销,自己可以參考下邊原則贯涎;
/***
#pragma pack -> 程序編譯器對(duì)結(jié)構(gòu)的存儲(chǔ)的特殊處理確實(shí)提高CPU存儲(chǔ)變量的速度,但是有時(shí)候也帶來(lái)了一些麻煩慢洋,我們也屏蔽掉變量默認(rèn)的對(duì)齊方式塘雳,自己可以設(shè)定變量的對(duì)齊方式。
* 內(nèi)存對(duì)齊規(guī)則:
* 1. 取 pake(n) 中的值 , 去結(jié)構(gòu)體中最大類型的大小 m ,兩者取小 即為外部對(duì)齊 其大小y = min(n,m);
* 2. 將每一個(gè)結(jié)構(gòu)體的成員大小與 y 比較 ,取小為x,做內(nèi)對(duì)其大小;
* 3. 假設(shè)起始地址為0x00 開(kāi)始, 能被x整除的地方開(kāi)始存值;
* 4. 外部對(duì)齊原則是根據(jù)y值,進(jìn)行補(bǔ)空操作;
*/
3 . 有問(wèn)題
將Node * tmp = head->next普筹; 修改為 Node * tmp = head败明;
并且加上 head.next = NULL; 否則翻轉(zhuǎn)完成之后,最后一個(gè)節(jié)點(diǎn)的next 不為NULL太防;
// 核心代碼就這兩句妻顶,每次插入到head的后面,并將新插入進(jìn)來(lái)的tmp指向下一個(gè)節(jié)點(diǎn)
tmp->next = p->next;
p->next = head->next;
4 . 核心代碼蜒车,參考如下 (PS:寫(xiě)出來(lái)n個(gè)for嵌套的同學(xué)可以去面壁了讳嘱。)
void dfs(int step){
if(step == n+1){
for(i=1;i<=n;i++){
printf("%d",steps[i]);
}
putchar(10);
return;
}
for( int i=1;i<=n;i++){
if(book[i] == 0){
steps[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0; // 請(qǐng)記得一定要將位置標(biāo)記為可用
}
}
}
5 . 輸出 :255 每答對(duì)的可以參考下面的邏輯
第一, strlen 在計(jì)算個(gè)數(shù)的過(guò)程中酿愧,遇見(jiàn) '\\0' 就會(huì)結(jié)束計(jì)數(shù)沥潭;
第二, 在int類型轉(zhuǎn)換成char 的過(guò)程中嬉挡,會(huì)切斷數(shù)據(jù)钝鸽;
1111 1111 1111 1111 -1
1111 1111 1111 1110 -2
1111 1111 1111 1101 -3
...
1111 1111 0000 0001 -255 -> 0
1111 1111 0000 0000 -256
6 . 不是
在 int (* p) [5] = arr; 之后庞钢, 可以理解成 p[5][20]
輸出結(jié)果 :25
7 . 遞歸
void strRevesal(char *p){
if(*p){
strRevesal(p+1);
printf("%c",*p);
}
}
// 還有一種方式倒置字符串拔恰,使用二分的思維方式 , 可以參考一下:
char * str_revesal(char *var){
char *start = var;
char *end = start + strlen(var) - 1;
while(start<end){ // 地址是有高低的
*start ^= *end ;
*end ^= *start ;
*start ^= *end ;
start++;
end--;
}
return var;
}
8 . **思路1 : **
設(shè)兩個(gè)工作指針基括,一個(gè)快一個(gè)慢颜懊,如果有環(huán)的話,它們會(huì)必然在某點(diǎn)相遇。
int judgeDList(DNode *head){
DNode *p,*q;
p = q = head;
while(p!=NULL && q!=NULL && q->next!=NULL){
p = p->next;
if(q->next != NULL)
q = q->next->next;
if(q==p)
return 1;
}
return 0;
}
**思路2: **
設(shè)兩個(gè)工作指針p河爹、q使鹅,p總是向前走,但q每次都從頭開(kāi)始走昌抠,對(duì)于每個(gè)節(jié)點(diǎn),看p走的步數(shù)是否和q一樣鲁僚。比如p從A走到D炊苫,用了4步,而q則用了14步冰沙。因而步數(shù)不等侨艾,出現(xiàn)矛盾,存在環(huán)拓挥。
9 . 輸出一個(gè)pass:
先說(shuō)一下原理唠梨,計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的時(shí)候 采用的是二進(jìn)制,整除初二區(qū)域侥啤,小數(shù)乘2去整当叭。
所以小數(shù)除了0.5意外,都會(huì)有精度丟失的情況盖灸;
這里double是float位數(shù)的二倍蚁鳖,自然 丟失的情況不一樣。