《c和指针》笔记7
除了優先級不同以外,下標表達式array[index]和間接訪問表達式*(array + (value))是一樣的。原因就如前一篇文章提到的,數組名是指向數組第一個元素的指針常量,所以下標既可以用于數組名,也可以用于指針表達式,但是當下標用于指針表達式的時候,編譯器將失去檢查下標有效性的能力,因此在程序可維護性和運行效率上還是要多斟酌。
指針有時會比下標更有效率,下標絕對不會比指針更有效率,前提是他們必須被正確的使用。
雖然下標表達式和間接表達是可以是相同的,但是數組和指針并不相等。除非當數組作為形參時,數組和指針才是相等的,因為實際傳遞的都是指向數組第一個元素的指針的一份拷貝。但是如果對該指針進行間接訪問操作并進行修改的話,那么函數將會修改那個對應的標量了,除非對函數參數添加關鍵字const。
對于數組形參我們可以使用如下原型(它們是相等的):
int strlen(cahr *string); int strlen(char string[]);除了以上情況以外,如下代碼,它們是不相等的:
char *string = "Hello"; char string[] = "Hello" // 等于{"H", "e", "l", "l", "o", 0};前者是初始化一個字符數組,而后者是一個真正的字符串常量。
數組在聲明的時候會分配一些空間用于容納數組元素,但是聲明指針的時候,只會分配用于容納指針的內存。
在對數組進行初始化的時候,如果初始化的個數少于數組元素的個數,那么數組最后的幾個元素將會用缺省值進行初始化(默認值)。
如果數組在初始化的時候長度未給出,那么編譯器將使這個數組的長度設置為剛好能容納初始值列表所有元素的長度。
數組可以用一種很像字符串常量的快速方法進行初始化。
多維數組實際是一維數組的一種特型,因為元素本身也是數組。對于多維數組的初始化我們可以使用如下方式:
int arr[2][3][4] = {{{1, 2, 3, 4},{2, 3, 4, 5},{3, 4, 5, 6}},{{1, 2, 3, 4},{2, 3, 4, 5},{3, 4, 5, 6}} }; //或者 int arr[2][3][4] = {{{1},{2}},{{1, 2, 3, 4}} }; //或者 int arr[2][3][4] = {1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6 };如上面代碼所示,我們可以在初始化的時候,給出所有元素的值,也可以給出部分元素的值,但是對于使用多個{進行初始化以及只是用一個{進行初始化的區別就是,如果我們想使用第三種方式對部分元素進行初始化,那么我們就必須給出前面元素的默認值,如:
int array[2][3][4] = {0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6 };而且在代碼可讀性方面,使用單個{聲明的方式是很難讀懂的,我們必須自己一個個的去計算元素所對應的位置。
以上的多維數組我們也可以聲明為指針數組。
對于字符串列表我們可以使用矩陣進行存儲,也可以以指向字符串常量的指針數組來存儲。它們的區別在于,矩陣每行必須與最長字符串的長度一樣長,但是它不需要任何指針,而指針數組本身需要占用空間,但是每個指針所指向的字符串所占用的空間就是字符串本身的長度。在使用過程中,如果長度差不多,我們可以使用矩陣來存儲,但是如果字符串列表中大多數字符串都差不多,但是唯獨有幾個特別長或者特別短的情況下,我們則可以選擇使用指針數組,相對會緊湊一些,它取決于指針所占用的空間是否小于每個字符串都存儲與固定長度的行所浪費的空間,但是實際上差別并不大。
轉載于:https://www.cnblogs.com/ahl5esoft/archive/2012/06/26/2562995.html
總結
- 上一篇: 简单介绍下我使用了一年多还不知道的Sql
- 下一篇: js中的 Dictionary 的用法