標籤:sans view 指標的使用 middle space title display init label
C語言指標和數組binsearch else-if shellsort insertsort 指標和地址
指標是程式設計語言中的一類資料類型及其對象或變數,用來表示或儲存一個記憶體位址,這個地址的值直接指向(points to)存在該地址的對象的值。
取值運算*p返回儲存在記憶體位址為p的記憶體空間中的值。取地址&p運算則返回運算元p的記憶體位址
C語言是以傳值的方式將參數值傳遞給被調用函數,被調用函數不能直接修改主調函數中的值,需要修改主調函數中的值就需要利用指標
指標和數組
數組名代表的是該數組的第一個元素的地址,對於a[i]的引用可以寫成*(a+i)或者*(pin + i)或者pin[i],通過數組名和下標實現的運算式可等價通過指標和位移量實現
int a[10];int *pin;pin = &a[0];pin = a;pin = pin + 1;pin = &a[1];pin = a + 1;
不同的是數組名和指標之間,數組名代表的是一個常量,相反指標代表的是一個變數,因此pin = a和pin++是合法的,而a = pa和a++是錯誤的
地址算術運算
指標可以進行比較運算:指向同一個數組的指標可以進行== <= >= !=等
同樣指標可以進行與整數相加或相減運算,如p+n其中n的長度不是固定的,會隨著指標等比例的縮放,減法也是相同的
指向同個數組的兩個指標可以相減或者比較運算如p-q+1代表兩指標之間的元素個數
指標不可進行上述以外的其他運算,如兩指標之間的相加運算、乘除運算等,同double或者float之間的加減運算,以及強制轉換運算
字元指標和函數
字串常量就是一個字元數組:"I am a string",在內部表示中字元和\0組成
char amessage[] = "now is the time"; //定義一個數組char *message = "now is the time"; //定義一個指標
對於第一種情況,定義了一個數組,其中amessage指向這個字元數組的第一個字元,固定不變,數組中的單個字元可以進行修改。而對於第二種情況,message指向一個字串常量,只是將一個指向該字串常量的指標賦值給了message,並沒有進行字串的複製,只是涉及到指標的操作,C語言沒有提供處理整個字串的運算子。
指標數組以及指向指標的指標
指標數組和數組指標的區別,指標數組就是一個數組,而這個數組的每一個元素都是一個指標;數組指標是一個指標,而這個指標指向一個數組
int a[10];int *p[10];int (*p)[10] = &a; //數組指標的使用
enter description here
a和&a的區別,對於a數組名的值就是一個指標常量,也就是指向數組的第一個元素(代表第一個元素的地址),&a指向的是整個數組,然而&a和a的值相同,不同的是&a+1和a+1代表的含義不同,&a+1增加了整個數組的長度,a+1增加了一個元素的長度(a[1])
多維陣列
daytab[i][j]表示一個二維數組,如果要將一個二維數組作為一個參數傳遞給函數,那麼必須在函式宣告中指明數組的列數(與數組的行數沒有多大的關係)。怎麼解釋啦?向函數傳遞的是一個指標,這時就是傳遞的就是一個具有j個元素的行向量,也就是前面所說的數組指標
可以從上面的多維陣列可以得出:數組指標的每一行的長度相同。這也是和指標數組不同的地方,指標數組的每個指標指向的長度可以不一樣
char *name[] = {"illegal month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
上面定義的就是一個指標數組的初始化,每個元素的長度都不一樣,name[0](或者name)指向的就是第一個元素
命令列參數
在支援C語言的環境中,可以在程式開始時將命令列參數傳遞給程式。調用主函數main時,它帶有兩個參數,第一個參數(習慣為argc,用於參數計數)表示命令列中參數的數目,第二個參數(習慣為argv,用於參數向量)是一個指向字串數組的指標,其中每個字串對應一個參數
int main(int argc, char *argv[])
argv[0]表示函數名,因此argc的值至少為1,第一個選擇性參數為argv[1],最後一個選擇性參數為argv[argc - 1]
C語言指標和數組