陣列與指標:
陣列元素的指標就是陣列元素的位址
指向陣列元素的指標,它的方法與指向變數的指標變數相同
引用乙個陣列元素可以用:
(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++)
for(i=0;i<10;i++)
(3) 用指標變數指向陣列
int i,a[10],*p;
for(i=0;i<10;i++)
for(p=a;i<(a+10);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. 指標變數的值是可以改變的;
另外,如定義乙個指標變數,並使用它指向乙個字串,就可以用下標形式,引用指標變數所指的字串中的字元.
C語言中字元陣列和字串指標分析
寫下面的測試程式 include int main int argc,char argv 執行後螢幕上得到如下結果 其實看到結果估計很多東西就好明白了,先看看前三個輸出也就是關於變數day的,在 char day 15 abcdefghijklmn 這個語句執行的時候,系統就分配了一段長15的記憶體...
C語言中字元陣列和字串指標分析
這幾天搞unix上的c程式,裡面用到了很多字元陣列和字串指標,我記得在學完c語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過c,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式 01 include 02 03intmain i...
C語言中字元陣列和字串指標分析
這幾天搞unix上的c程式,裡面用到了很多字元陣列和字串指標,我記得在學完c語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過c,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式 include int main int argc...