?? cc++interviewhandbook.txt
字號:
char a[10],strlen(a)為什么等于15?運行的結(jié)果
#i nclude "stdio.h"
#i nclude "string.h"
void main()
{
char aa[10];
printf("%d",strlen(aa));
}
sizeof()和初不初始化,沒有關(guān)系;
strlen()和初始化有關(guān)。
char (*str)[20];/*str是一個數(shù)組指針,即指向數(shù)組的指針.*/
char *str[20];/*str是一個指針數(shù)組,其元素為指針型數(shù)據(jù).*/
long a=0x801010;
a+5=?
0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為8392720,再加上5就是8392725羅
1)給定結(jié)構(gòu)struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};問sizeof(A) = ?
給定結(jié)構(gòu)struct A
{
char t:4; 4位
char k:4; 4位
unsigned short i:8; 8位
unsigned long m; // 偏移2字節(jié)保證4字節(jié)對齊
}; // 共8字節(jié)
2)下面的函數(shù)實現(xiàn)在一個數(shù)上加一個數(shù),有什么錯誤?請改正。
int add_n ( int n )
{
static int i = 100;
i += n;
return i;
}
當(dāng)你第二次調(diào)用時得不到正確的結(jié)果,難道你寫個函數(shù)就是為了調(diào)用一次?問題就出在 static上?
// 幫忙分析一下
#i nclude<iostream.h>
#i nclude <string.h>
#i nclude <malloc.h>
#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <memory.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main()
{
AA aa;
char cc[100];
strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
memcpy(&aa,cc,sizeof(AA));
cout << aa.b1 <<endl;
cout << aa.b2 <<endl;
}
答案是 -16和1
首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.
經(jīng)過strcpy和memcpy后,aa的4個字節(jié)所存放的值是:
0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011
所以,最后一步:顯示的是這4個字節(jié)的前5位,和之后的2位
分別為:10000,和01
因為int是有正負之分 所以:答案是-16和1
求函數(shù)返回值,輸入x=9999;
int func ( x )
{
int countx = 0;
while ( x )
{
countx ++;
x = x&(x-1);
}
return countx;
}
結(jié)果呢?
知道了這是統(tǒng)計9999的二進制數(shù)值中有多少個1的函數(shù),且有
9999=9×1024+512+256+15
9×1024中含有1的個數(shù)為2;
512中含有1的個數(shù)為1;
256中含有1的個數(shù)為1;
15中含有1的個數(shù)為4;
故共有1的個數(shù)為8,結(jié)果為8。
1000 - 1 = 0111,正好是原數(shù)取反。這就是原理。
用這種方法來求1的個數(shù)是很效率很高的。
不必去一個一個地移位。循環(huán)次數(shù)最少。
int a,b,c 請寫函數(shù)實現(xiàn)C=a+b ,不可以改變數(shù)據(jù)類型,如將c改為long int,關(guān)鍵是如何處理溢出問題
bool add (int a, int b,int *c)
{
*c=a+b;
return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
}
分析:
struct bit
{ int a:3;
int b:2;
int c:3;
};
int main()
{
bit s;
char *c=(char*)&s;
cout<<sizeof(bit)<<endl;
*c=0x99;
cout << s.a <<endl <<s.b<<endl<<s.c<<endl;
int a=-1;
printf("%x",a);
return 0;
}
輸出為什么是
4
1
-1
-4
ffffffff
因為0x99在內(nèi)存中表示為 100 11 001 , a = 001, b = 11, c = 100
當(dāng)c為有符合數(shù)時, c = 100, 最高1為表示c為負數(shù),負數(shù)在計算機用補碼表示,所以c = -4;同理
b = -1;
當(dāng)c為有符合數(shù)時, c = 100,即 c = 4,同理 b = 3
位域 :
有些信息在存儲時,并不需要占用一個完整的字節(jié), 而只需占幾個或一個二進制位。例如在存放一個開關(guān)量時,只有0和1 兩種狀態(tài), 用一位二進位即可。為了節(jié)省存儲空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域, 并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節(jié)的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結(jié)構(gòu)定義相仿,其形式為:
struct 位域結(jié)構(gòu)名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結(jié)構(gòu)變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共占兩個字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所剩空間不夠存放另一位域時,應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。
2. 由于位域不允許跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調(diào)整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型, 不過其成員是按二進位分配的。
二、位域的使用位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為: 位域變量名•位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
pri
改錯:
#i nclude <stdio.h>
int main(void) {
int **p;
int arr[100];
p = &arr;
return 0;
}
解答:
搞錯了,是指針類型不同,
int **p; //二級指針
&arr; //得到的是指向第一維為100的數(shù)組的指針
#i nclude <stdio.h>
int main(void) {
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
}
下面這個程序執(zhí)行后會有什么錯誤或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX],i;//i被定義為unsigned char
for (i=0;i<=MAX;i++)
A[i]=i;
}
解答:死循環(huán)加數(shù)組越界訪問(C/C++不進行數(shù)組越界檢查)
MAX=255
數(shù)組A的下標(biāo)范圍為:0..MAX-1,這是其一..
其二.當(dāng)i循環(huán)到255時,循環(huán)內(nèi)執(zhí)行:
A[255]=255;
這句本身沒有問題..但是返回for (i=0;i<=MAX;i++)語句時,
由于unsigned char的取值范圍在(0..255),i++以后i又為0了..無限循環(huán)下去.
struct name1{
char str;
short x;
int num;
}
struct name2{
char str;
int num;
short x;
}
sizeof(struct name1)=8,sizeof(struct name2)=12
在第二個結(jié)構(gòu)中,為保證num按四個字節(jié)對齊,char后必須留出3字節(jié)的空間;同時為保證整個結(jié)構(gòu)的自然對齊(這里是4字節(jié)對齊),在x后還要補齊2個字節(jié),這樣就是12字節(jié)。
intel:
A.c 和B.c兩個c文件中使用了兩個相同名字的static變量,編譯的時候會不會有問題?這兩個static變量會保存到哪里(棧還是堆或者其他的)?
static的全局變量,表明這個變量僅在本模塊中有意義,不會影響其他模塊。
他們都放在數(shù)據(jù)區(qū),但是編譯器對他們的命名是不同的。
如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
result: 16, 24
第一個struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
理論上是這樣的,首先是i在相對0的位置,占8位一個字節(jié),然后,j就在相對一個字節(jié)的位置,由于一個位置的字節(jié)數(shù)是4位的
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -