1.結構體巢狀時的sizeof運算
寫出下面各結構體的sizeof計算結構:
struct s1 ;
struct s2 ;
結構體s1所占用的空間為4個位元組。
結構體s2的第乙個成員a占用4個空間,第二個成員b占用1個空間,而結構體s1型別中占用空間最大的型別為char型別,是1個位元組,因此結構體s2的sizeof運算結果只要是1的整數倍即可。最終結構體s2的sizeof運算結果為5.
2.指標與陣列的區別。
char str1[15] = 「hello world」;
char str2[15] = 「hello world」;
儘管陣列裡面的內容完全一樣,但是str1和str2這兩個陣列名等價於各自陣列首元素的位址,所以str1 != str2。
char *str2 = 「hello world」;
cha * str3 = 「hello world」;
通過指標指向了同一位址,因此str2 == str3表示式的結果為真。
3.指標常量與常量指標
int a =
10, b =20;
int*
const p =
&a;*p =
30;
const是用來修飾p的,因此p是常量,內容是不能改變的。*p是可以改變的,修改後p指向的內容為30.
常量指標:本質上是乙個指標,常量表示指標指向的內容,說明指標指向乙個「常量」。在常量指標中,指標指向的內容是不可改變的,指標看起來就好像指向了乙個常量。常量指標的用法如下:
int a =
10, b =20;
const
int*p =
&a;p =
&b;
第二行const與 * p 相鄰,說明const是用來修飾 * p 的,因此 * p的值是不可改變的,即p指向的內容不可以通過p來修改,也就是說無法通過給 * p賦值來修改p指向的內容。
4.指標陣列與陣列指標
指標陣列:存放指標的陣列。
指標陣列本質上是乙個陣列,指標是陣列中的內容,表示陣列中的每個元素都是指標,因此指標陣列就是存放指標的陣列。下面通過乙個例子來了解指標陣列的用法:
int a =
10, b =20;
int*p[2]
;p[0]
=&a;p[1
]=&b;
在指標陣列的定義中,根據運算子優先順序,[ ]的優先順序高於*的優先順序,因此變數p與[2]結合,表明p是乙個陣列,而陣列的元素的型別在變數的左側宣告,因此陣列p是int * 型別的陣列。
陣列指標:指向陣列的指標。
陣列指標本質上是乙個指標,陣列是指標指向的型別,表示指標指向乙個陣列,因此陣列指標就是指向陣列的指標,下面通過乙個例子來了解陣列指標的用法:
int a[3]
=;int(
*p)[3]
;p =
&a;
上面的**定義了乙個陣列指標p,通過將p與* 括起來,使變數p先與*結合起來,表明p是乙個指標,然後將(*p)遮住,剩餘部分就是指標指向的型別,也就是int[3]型別,綜上所述,變數p是乙個指標,指標指向乙個長度為3的int型別的陣列,因此p是乙個陣列指標。
5.簡述指標陣列與指向指標的指標的區別
寫出指標陣列str中四個指標元素的值。
int
main()
;char
** p = str +1;
str[0]
=(*p++)+
1;str[1]
=*(p +1)
; str[2]
= p[1]
+3; str[3]
= p[0]
+(str[2]
- str[1]
);
char
** p = str +
1;
陣列名str等價於陣列首元素的位址,而str+1表示陣列中第二個元素的位址&str[1],因此指標p指向陣列str中的第二個元素str[1],而str[1]本身也是指標,指向字串「to」的首字元t,因此指標p是乙個指向指標的指標。*p指向字串「to」的首字元t。此外 *p++ 中的 *p沒有括號並且是後++,因此賦值語句相當於執行了str[0] = *p + 1後再執行p++,而 *p+1指向字串「to」的第二個字元o,因此str[0]指向了字元o,p++後p指向指標數租str的第三個元素str[2]。
str[1]
=*(p +1)
;str[2]
= p[1]
+3;
此時,p指向str[2],p + 1指向str[3],也就是p + 1 = &str[3],解引用可得*(p+1)= str[3],因此str[1] = str[3]。由於str[3]指向字串「beijing」的首字母b,因此str[1]也指向同樣的位置。
在分析str[2]時,首先應該明確p[1]等價於*(p+1),這是訪問陣列元素的兩種方式。根據對str[1]的分析可知,*(p+1)指向字串「beijing」的首字元b,也就是p[1]指向字串「beijing」的首字元b,p[1]+3就指向字串「beijing」的第四個字元j,因此str[2]就指向字串「beijing」的第四個字元j。
str[3]
= p[0]
+(str[2]
- str[1]
);
表示式str[2]-str[1]表示兩個指標之間元素的個數,str[2]指向字串「beijing」的第四個字元j,而str[1]指向字串「beijing」的首字元b,相差3個字元,因此str[2]-str[1]=3。此外,p[0]等價於*(p+0),也就是*p,而 *p=str[2],因此p[0]同樣指向字串「beijing」的第4個字元j,而p[0]+3就指向字串「beijing」的第7個字元g.
6. 簡述指標與引用的區別
7. 程式中的變數儲存區
下面程式中的變數定義都涉及哪些儲存區?
int a =0;
intmain()
}
遞迴演算法存在乙個問題:當遞迴層數過深時,有可能產生棧溢位。在遞迴呼叫過程中,每一次遞迴呼叫都會保留現場,把當前的上下文壓入函式棧,隨著遞迴呼叫層數的深入,壓入函式棧的內容會越來越多,直到函式棧的空間用盡,而遞迴程式仍然沒有滿足返回的條件,繼續向更深的一層呼叫,就會發生棧溢位。
下面是二叉樹遍歷的迴圈實現。
void
preorder
(bitree *root)if(
!s.empty()
)}}
10.不使用c/c++庫函式,程式設計實現strcmp的功能
完整的演算法描述如下:
int
mystrcmp
(const
char
*str1,
const
char
*str2)
while
(*str1 !=
'\0'
&&*str2 !=
'\0'
&&*str1 ==
*str2)if(
*str1 !=
'\0'
&&*str2 ==
'\0'
)elseif(
*str1 ==
'\0'
&&*str2 !=
'\0'
)elseif(
*str1 >
*str2)
elseif(
*str1 <
*str2)
11.程式設計實現strcpy的功能char
*mystrcpy
(char
*str1,
const
char
*str2)
while
(*str2 !=
'\0'
)*p =
'\0'
;return str1;
}
12.程式設計實現函式strstr的功能char
*mystrstr
(const
char
*str1,
const
char
*str2)
while
(*str1 !=
'\0')}
while
(*src ++
==*sub++);
str1++;}
return
null
;}
13.簡述memcpy與strcpy的區別
memcpy函式是c語言中的記憶體拷貝函式,它只提供了一般的記憶體拷貝功能,而不是針對字串的。memcpy函式的原型為:
void
*memcpy
(void
* dest,
const
void
*src, size_t count)
;
strcpy是專為字串拷貝定義的函式,其函式原型為:
char
*strcpy
(char
*str1,
char
*str2)
;
其作用是將指標str2指向的字串拷貝到指標str1指向的連續記憶體空間中,在使用strcpy進行字串拷貝時,不僅拷貝字串的內容,還會拷貝字串的結束標誌『\0』。使用strcpy進行字串拷貝時不需要指定拷貝的長度,函式會自動查詢結束符『\0』。 vsto 知識點整理與收藏
excel.worksheet newsheet globals.thisworkbook.sheets.add missing.value,missing.value,missing.value,missing.value as excel.worksheet newsheet.visible m...
陣列與字串的知識點
陣列與字串 1.稍大的陣列盡量定義在main函式外,否則會異常退出。2.陣列a複製k個元素到陣列b,memcpy b,a,sizeof int k 元素是浮點型 memcpy b,a,sizeof double k 全部複製 memcpy b,a,sizeof a 3.memset a,0,size...
IO流字元流知識點整理
1.字元流是什麼 字元流是可以直接讀寫字元的io流 字元流讀取字元,就要先讀取到位元組資料,然後轉為字元.如果要寫出字元,需要把字元轉為位元組再寫出.2.filereader filereader類的read 方法可以按照字元大小讀取 filereader fr new filereader aaa...