數組與指標:
數組元素的指標就是數組元素的地址
指向數組元素的指標,它的方法與指向變數的指標變數相同
引用一個數組元素可以用:
(1)下標法 如:a[i]形式;
(2)指標法 如:*(a+i)或*(p+i);
a是數組名,p是指向數組元素的指標變數,它的初值p=a
注意:
數組名即翻譯成數組的第一個元素的地址,其中a或p是第一個元素的地址,加上i就是指向第i個元素。注意,它不是地址加上i,具體要看是什麼類型的。
例題:
輸出數組中的全部的元素的方法
(1) 下標法(就是簡單地數組的定義,初始化,賦值及應用)
(2) 通過數組名計算數組的元素的地址,找到元素的值
Int I,a[10];
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(i=0;i<10;i++){
Printf(“%d”,*(a+i));
}
(3) 用指標變數指向數組
Int I,a[10],*p;
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(p=a;i<(a+10);p++){
Printf(“%d”,*p);
}
用數組名做函數參數:
C語言調用函數時,虛實結合的方法都是採用“值傳遞”方式,當用變數名做函數時,傳遞的是變數的值,當採用數組名作為函數參數時,
由於數組名代表的是數組元素首地址,因此傳遞的值是地址,所以要求形參為指標變數。
小結:
如果有一個實參數組,想在函數中改變此數組中元素的值,實參與形參的對應關係有以下4中情況:
(1) 形參和實參都用數組名,如:
Int a[10];
F(a,10);
Void f(int x[],int n){}
(2) 實參用數組名,形參用指標變數,如:
Int a[10];
F(a,10);
Void f(int *a,int n){}
(3) 實參形參都用指標變數,如:
Int a[10],*p=a;
F(p,10);
Void f(int *x,int n){}
(4) 實參為指標變數,形參為數組名,如:
Int a[10],*p=a;
F(p,10);
Void f(int x[],int n){}
字串與指標
字串中字元的存取可以用下標法,也可以用指標方法
雖然用字元數組和字元指標變數都能實現字串的儲存和運算,但他們還是有區別的:
1. 字元數組有若干個數組元素組成,每個元素中存放一個字元,而字元指標變數中存放的是地址即字串第一個字元的地址,絕不是將字串放到字元指標變數中;
2. 賦值方式.字元數組只能對各個元素賦值;
3. 對字元指標變數賦初值;
4. 如果定義一個字元數組,在編譯時間為他分配記憶體單元,它有確定的地址.而定義一個字元指標變數時,給指標變數分配記憶體單元,在其中可以放一個字元變數的地址,也就是說,該指標變數可以指向一個字元資料,但如果未對它賦予一個地址值,則它並未具體指向一個確定的字元資料;
如:
char str[10];
scanf("%s",str);
這樣編寫是完全可以的。經常有人用這樣的方法
如:
char *a;
scanf("%s",a);
它的目的是想輸入一個字串,一般也能運行,但這種方法是危險的,因為指標變數沒有賦初值時,它是隨機指向的。
5. 指標變數的值是可以改變的;
另外,如定義一個指標變數,並使用它指向一個字串,就可以用下標形式,引用指標變數所指的字串中的字元.