下面介紹指針與數組的關系
指向一維數組的指針
指向多維數組的指針
指向字符串的指針
1.指向數組元素的指針變量的定義方式:類型 *指針變量名
例如:int * p;
2.數組名的含義:數組名代表數組的首地址。
3.指向數組元素的指針變量的賦值:指針變量= 數組某一元素的地址(通常是首地址)
例如: int a[10],*p;
p=a;或p = &a[0];
圖示:
指向數組的指針的加減運算
p++;//p指針移動p所指向類型的字節,p所指向的是int型數組,所以p移動兩個字節指向a[1]
引用一個數組有兩種方法:
1.下標法:如a[i]
2.指針法:如*(a+i)或*(p+i)
若有數組及指針定義 int a[5] ,*p = a;
下標法:a[0] a[1] a[2] a[3] a[4]
指針法:*p *(p+1) *(p+2) *(p+3) *(p+4)
p[0] p[1] p[2] p [3] p[4]
*a *(a+1) *(a+2)*(a+ 3) * (a+4)
通過數組名計算數組元素的地址,找出元素的值
main()
{
int a[10];int i;
for (i = 0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(i = 0 ;i<10;i++)
printf("%d",*(a+i));
}
用指針變量指向數組元素:
main()
{
int a[10];
int *p,i;
for(i = 0 ;i<10;i++)
scanf("%d",p++);
printf("\n");
for(p = a;p<(a+10);p++)
printf("%d",*p);
}
注:p++合法,但a++不合法(a是數組名,代表數組首地址,是常數地址)
要注意指針變量的當前值
p++;(或p+=1;)
p將指向下一個元素,即a[1].
x = *p++;//不建議使用
*與++是同級運算,等價於先計算*p,為x賦值a[0],再++
*(p++)與*(++p)
*(p++)是先取*p的值,後使p+1;
*(++p)是先使p加1,後取*p的值
(*p)++;
表示p所指向的元素值加1(即a[0]++),而不是指針值加1.
Example:
main()
{
int a[3],*p =a;
a[0] = 10; a[1] = 20;a[2] = 30;
printf("%d/t",*p++);
printf("%d\n",*++p);
}
輸出結果:10 30
main()
{
int a[] = {1,2,3,4,5};
int *p = a+3;
printf("%d,%d,%d\n",*p,*(p+1),*p+3);
}
結果:4,5,7
多維數組的指針
1.定義引用形式與指向一維數組的指針類似
例如:int a[3][4],*p
p=&a[2][3];
2.行列地址表示
若有定義:int a[3][4];
下圖表格中的數字表示每個元素的地址值。
指針與字符串
1.字符串的表示形式
用字符數組實現:char string[] = " I Love China!";
用字符指針實現:字符指針變量的定義 :char *p;
賦值:指針=串中某一字符地址
char *s = "I Love China!" ;//初始化s
字符串都以/0為結束標示符,所以實際長度為字符串長度+1.