1.
#include
class shape
~shape()
int main()
int aaa;
std::cin>>aaa;
輸出的是ctorctordtor,因為b沒有呼叫delete析構
a與b有什麼區別了,就是乙個在棧上,乙個在堆上嗎?
2.c語言是從那種語言發展而來的?
答案很直接,從b語言發展而來的--_--
3.char *str = "hello"; 與 char str2 = "hello"; 有什麼區別?
char *str = "hello";
char str2 = "hello2";
str2[0] = 'm'; //會執行報錯,非法訪問
str[0] = 'x'; //這個就不會報錯
為什麼了?
(在寫程式的時候,如何能夠讓控制台程式在執行完之後不要一閃而逝,而是出現press any key to continue...了?
就是按ctrl + f5執行,就是不進行除錯,直接執行。
還有一種方法就是
#include
system("pause"); //還有那些system命令了??
我想知道的是"hello"和「hello2」分別存在什麼地方?
4.標頭檔案省略
int _tmain(int argc, _tchar* argv)
int x = 100;
int y = 200;
int z = 300;
//printf("x 變數的位址是%x\n",&x);
printf("x 變數的位址是%p\n",&x);
printf("x 變數的大小是%d\n",sizeof(x));
//printf("y 變數的位址是%x\n",&y);
printf("y 變數的位址是%p\n",&y);
printf("y 變數的大小是%d\n",sizeof(y));
//printf("z 變數的位址是%x\n",&z);
printf("z 變數的位址是%p\n",&z);
printf("z 變數的大小是%d\n",sizeof(z));
system("pause");
在release狀態下會輸出如下結果:
x 變數的位址是001dfce4
x 變數的大小是4
y 變數的位址是001dfce8
y 變數的大小是4
z 變數的位址是001dfcec
z 變數的大小是4
請按任意鍵繼續. . .
但是在debug狀態下,會輸出如下結果,x,y之間相距12個位元組,這可能是debug狀態下,編譯器加入了一些多餘的資訊進去。
x 變數的位址是0027f7c0
x 變數的大小是4
y 變數的位址是0027f7b4
y 變數的大小是4
z 變數的位址是0027f7a8
z 變數的大小是4
請按任意鍵繼續. . .
5.大小端的問題
unsigned int a=0x12345678;
char *c=(char*)&a;
printf("%x %x %x\n",*c,*(c+1),*(c+1)+1);
輸出分別為:78,56,57
big-endian,little-endian看到過好多次了,但是還是沒有弄的太明白。。。
今天就來好好搞定它
這篇部落格講的不錯:
其中的這個栗子很好
舉個例子,從記憶體位址0x0000開始有以下資料
0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd
如果我們去讀取乙個位址為0x0000的四個位元組變數:
若位元組序為big-endian,則讀出結果為0x1234abcd;
若位元組序位little-endian,則讀出結果為0xcdab3412.
如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
6.const char*, char const*, char*const
const char*, char const*, char*const的區別問題幾乎是c++面試中每次 都會有的題目。 事實上這個概念誰都有只是三種宣告方式非常相似很容易記混。 bjarne在他的the c++ programming language裡面給出過乙個助記的方法: 把乙個宣告從右向左讀。
char * const cp; ( * 讀成 pointer to ) --- cp is a const pointerto char
const char * p; ---- p is a pointer toconst char;
char const * p; ---- 因為c++裡面沒有const*的運算子,所以const只能屬於前面的兩種型別。
也可以這樣理解,const離誰近,那個就是const。
const char * p中const離char比較近,那麼就說明*p的內容不能修改。
char* const p中的const離p比較近,那麼就說明p的內容不能修改,即p不能指向別的位址了。
還有一種情況 const char* const p 表示p和*p都不能修改。
這個部落格也提到了這個問題,講的不錯
7.scanf("%lf %lf",&x,&y);
這句程式中,x,y都是double型的。%後的是lf而不是1f,是英文本母中的「l」,除錯了半天就是輸入不了。。。。
scanf如果要輸入double型的數,就必須使用lf。
8.int *p[n], int (*)p[n], int *p(), int (*)p()的區別
int *p[n]到時認識,表示的存了n個整數型指標的陣列。
int (*)p[n],這個就不太熟悉了。在vs2008上報錯,改寫成這樣int (*p)[n]就好了。
例子如下:
int m[3][4]=;
int (*p)[4];
p = m;
for(int i = 0; i < 5; i++)
coutcout<
上面程式中,兩個的輸出是一樣的。
int *p()也比較好理解,就是返回int型指標的函式。
int (*p)(), 這個是函式指標(int (*)p()好像也會報錯)。我們知道,我們定義乙個函式時,比如int f(),其實函式就是一段**,而f就是指向這個**開始的地方,也就是乙個位址。
9.陣列越界問題
陣列發生越界訪問時,可能出錯,程式崩潰,也可能執行正常,所以存在不確定型,比較危險。
下面是乙個比較複雜一點的例子,考到了陣列越界問題,也考到了unsigned char的範圍
const int max = 255;
unsigned char a[max],i;
for (i=0;i<=max;i++)
a[i]=i;
a[255] = 255發生了越界訪問,但是不一定會出錯,但是i=255之後,i++,i又回到了0,然後進行判斷i<=255,成功,會一直迴圈下去。
char
型別為乙個位元組,取值範圍是
[-128
,127]
,unsigned char [0,255]。
10.memset ,memcpy, strcpy的區別
extern void *memset(void *buffer, char c, int count);
把buffer
所指記憶體區域的前
count
個位元組設定成字元
c。返回指向
buffer
的指標。
extern void *memcpy(void *dest, void *src, unsigned int count);
由src所指記憶體區域複製count個位元組到dest所指記憶體區域。
src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。
extern char *strcpy(char *dest,char *src);
把src所指由null結束的字串複製到dest所指的陣列中。
src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。
一些筆試題(C C )
1.there are two variables,don t use if.else or or switch or other judgement statements,find out the biggest number of the two numbers.返回2個數中較大的數,不使用if...
C C 筆試題集錦
1.求下面函式的返回值 微軟 int func x int countx 0 while x countx x x x 1 return countx 假定x 9999。答案 8 思路 將x轉化為2進製,看含有的1的個數。2.什麼是 引用 申明和使用 引用 要注意哪些問題?答 引用就是某個目標變數的...
C C 技術筆試題
指標 include void getmemery char p,int num int main 答案 程式崩潰。實際上分配記憶體的只是形參p的乙個副本,函式呼叫結束後p又沒有返回給str,strcpy的str實際上是沒有分配記憶體。如果想不通過返回值的方式給str分配記憶體,程式如下。inclu...