C語言中關於陣列與指標和字串與指標的小結

2021-06-18 12:17:41 字數 1747 閱讀 1870

陣列與指標:

陣列元素的指標就是陣列元素的位址

指向陣列元素的指標,它的方法與指向變數的指標變數相同

引用乙個陣列元素可以用:

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