C語言指針和數組結合起來該怎么學?
如果對c語言有興趣,可以關注我,謝謝
1。指針和數組的關系,數組是指的一組數,咱們可以通過數組的下標一個一個來對數據進行訪問和操作。說白了,對于數組中的每一個空間,其實都是變量的存儲空間。這些空間都有地址。因此可以將每一個空間的地址給指針變量,這樣就可以用指針來取數組中的數據了。如:
int a[10],*p;
*p=&a[0]; 或者 *p=a; //兩者功能一樣,其實都是把數組中的第一個空間中的地址給了指針變量p.
還可以取 *p=&a[1]這是將數組中的第二空間的址址給了指針變量p.
2。指向數組的指針的運算,注意這是指針的運算,不是指針所指向的數據的運算 。 下述例子中,指針可以指向數組中的每一個數據。不過,也比較麻煩,就是需要對數組中的每個空間都要取地址,然后賦給指針變量。可不可以有更好的更方便的方法來用指針地來由于看過和操作數組中的數據呢?是可以的。如,
p=&a[0];
那么 p+1就指向了 a[1]中的數據,p+3就指向了 a[3]中的數據。
如果 p=&a[9]; 那么 p-1就指向a[8]中的數據,p-9就指向了a[0]中的數據
假設 p=&a[9]; q=&a[3]; 那么 p-q 就等于 9-3=6 。 q-p就等于 3-9=-6.
另外,指針可以進行關系運算(< <= > >=)和判等運算(!= ==).
3。指針用于數組處理,既然指針和數組有著緊密的關系,那么指針也肯定可以對數組進行操作。如:
從鍵盤上讀入數組:
int a[10], *p;
p=&a[0];
for(i=0;i<10;i++)
scanf("%d",p+i); //這里也可以用于p++,但是要注意,p自身發生了變化。
在屏幕上輸出數組:
int a[10], *p;
p=&a[0];
for(i=0;i<10;i++)
printf("%d",*(p+i)); //這里也可以用*p++,但是要注意,p自身發生了變化。
還可以對數組中的值進行計算操作:
int a[10], *p,sum=0;
p=&a[0];
for(i=0;i<10;i++)
sum+=*(p+i); //這里也可以用于*p++,但是要注意,p自身發生了變化。
4. 數組名可以作為指針,指針也可以作為數組名,如,int a[10] ; *(a+6) 和 a[6]效果是一樣的。
用指針作為數組名,如:
int a[10],*p;
p=&a[0];
p[1]和*(p+1)是一樣的效果。
5。指針和多維數組 ,這里只來說明一下二維數組。在內存當中,不管是一組數組還是二維數組,都是按順序存的,也就是說,對于長度為10的一維數組,在空間當中是批量連續開辟10個空間,對于10*10的二維數組,是批量連續開辟100個空間。因為這個特點,可以通過指針很方便地操作二組數組(即,可以用一個循環就可以對二維數組進行操作)。如:
int a[10][10],*p;
p=&a[0][0];
for (i=0;i<10*10;i++)
*p++=0;
6. 處理多維數組的行,如果想用指針來訪問多維數組中的一行元素,假設操作一個二維數組中第i行中的元素。如:
int a[10][10], *p;
p=&a[i][0];//這里表示指向第i行的第0個元素。
那么 p+1表示第i行的第1個元素即 a[i][1]
那么 p+2表示第i行的第2個元素即 a[i][2]
那么 p+3表示第i行的第3個元素即 a[i][3]
7. 處理多維數組中的列,如果準備用指針來操作某一列中的元素,如何進行操作呢?
int a[10][10], (*p)[10];
p=&a[0]; //這里是取第0行的地址,
p+1是取得第1行的地址
p+2是取得第2行的地址
p+3是取得第3行的地址
那么取第i列的元素,應該做如下操作
(*p)[i] 表示第0行的第i列
(*(p+1))[i] 表示第1行的第i列
(*(p+2))[i] 表示第2行的第i列