數(shù)組指針
一個(gè)變量有一個(gè)地址遍愿,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元耘斩,它們都有相應(yīng)的地址沼填。
所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址括授。
定義一個(gè)指向數(shù)組元素的指針變量
int a[10]; //定義a為包含10個(gè)整型數(shù)據(jù)的數(shù)組
int *p; //定義p為指向整型變量的指針
p=&a[0] //應(yīng)當(dāng)注意坞笙,因?yàn)閿?shù)組為int型,所以指針變量也應(yīng)為指向int型的指針變量荚虚。
把a(bǔ)[0]元素的地址賦給指針變量p薛夜。也就是說,p指向a數(shù)組的第0個(gè)元素版述。
1.png
C語言規(guī)定梯澜,數(shù)組名代表數(shù)組的首地址,也就是第0號(hào)元素的地址院水。
int a[10];
int *p;
// 第一種方式
p=&a[0];
p=a;
// 第二種方式
int *p=&a[0];
//這兩種方式是等價(jià)的
指針引用數(shù)組如果指針變量p已指向數(shù)組中的一個(gè)元素腊徙,
p+1指向同一數(shù)組中的下一個(gè)元素简十。
p-1指向同一數(shù)組中的前一個(gè)元素檬某。
p = &a[0] // 指針p 指向數(shù)組首地址
//p+i 就是 a[i] 的地址,或者說它們指向a數(shù)組的第 i 個(gè)元素螟蝙。
[/i]p+5 // 現(xiàn)在p往后移動(dòng)5個(gè)元素恢恼,現(xiàn)在指向 a[5]的地址
// *(p+i) 就是 p+i 所指向的數(shù)組 a元素(的內(nèi)容)
*(p+5) // 就是a[5]的內(nèi)容
輸出數(shù)組
//使用下標(biāo)方法
#include <stdio.h>
int main(){
int a[10], i;
// 賦值
for(i=0; i<10; i++)
a=i;
//打印
for(i=0;i<10;i++)
printf("a[%d]=%d\n", i, a);
return 0;
}
//使用計(jì)算元素的地址方法
#include <stdio.h>
int main(){
int a[10], i;
//賦值
for(i=0; i<10; i++)
*(a+i) = i;
//打印
for(i=0; i<10; i++)
printf("a[%d]=%d\n", i, *(a+i));
return 0;
}
//指針變量指向元素方法
#include <stdio.h>
int main(){
int a[10], i, *p;
p = a;
//賦值
for(i=0; i<10; i++)
*(p+i) = i;
//打印
for(i=0; i<10; i++)
printf("a[%d]=%d\n", i, *(p+i));
return 0;
}
例子
判別一個(gè)整數(shù)數(shù)組中各元素的值,若大于0 則輸出該值胰默,若小于等于0則輸出0值场斑。
#include <stdio.h>
void nzp(int *a){
int i;
for(i=0; i<5; i++){
if(a[i]<0) a[i]=0; //小于0的元素漓踢,賦值為0
}
}
int main(){
int b[5], i;
printf("Input 5 numbers:\n");
for(i=0; i<5; i++)
scanf("%d", &b[i]);
printf("Initial values of array b are: ");
for(i=0; i<5; i++)
printf("%d ", b[i]);
nzp(b);
printf("\nFinal values of array b are: ");
for(i=0; i<5; i++)
printf("%d ",b[i]);
return 0;
}
運(yùn)行結(jié)果:
Input 5 numbers:
1↙
3↙
-90↙
-23↙
100↙
Initial values of array b are: 1 3 -90 -23 100
Final values of array b are: 1 3 0 0 100
說明:
- 形參數(shù)組 和 實(shí)參數(shù)組類型必須一致
- 形參數(shù)組和實(shí)參數(shù)組的長度可以不同, 一般定義方法原型的參數(shù)漏隐,可以允許不給出數(shù)組長度喧半。如寫成 void nzp(int a[]), 當(dāng)然也可以 void nzp(int *a)