指標 陣列與字串知識點整理

2021-10-03 21:29:20 字數 4866 閱讀 9045

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...