1. 数组指针
- 指向数组的指针
- 对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的 ∗ ( p + i ) = a [ i ] *(p+i) = a[i] ∗(p+i)=a[i]
#include<stdio.h>
int main(){
int a1[3] = {2,3,5};
int *p1;
p1 = a1;
printf("*p1 = %d, *(p1+1) = %d, *(p1+2) = %d\n",*p1, *(p1+1), *(p1+2));
int *p2;
p2 = a1+2;
//两个指针相减,为在数组中相差个数
printf("p2-p1 = %d ,*p2 = %d",p2-p1,*p2);
return 0;
}
2. 指针数组
- 数组中元素为指针
- a [ i ] a[i] a[i] 表示获取第 i i i 个元素的值,该元素是一个指针,还需要在前面增加一个 ∗ * ∗ 才能取得它指向的数据,即 ∗ a [ i ] *a[i] ∗a[i]。
- 定义二级指针指向数组首地址,通过二级指针访问数组中指针指向的元素
#include<stdio.h>
int main(){
int i=14,j=24,t=34;
//定义指针数组,数组中元素为指针,存放指针指向的地址
int *a[3] = {&i,&j,&t};
int **p;
printf("*a[0] = %d, *a[1] = %d, *a[2] = %d\n",*a[0],*a[1],*a[2]);
//定义二级指针指向数组首地址,通过二级指针访问数组中指针指向的元素
p = a;
printf("**p = %d, **(p+1) = %d, **(p+2) = %d\n",**p,**(p+1),**(p+2));
return 0;
}
3. 二维数组与指针
- i n t ∗ p ; p = a [ 0 ] ; int *p; p = a[0]; int∗p;p=a[0]; p p p是指向一维数组的指针。 p + + p++ p++后, p p p指向 a [ 0 ] [ 1 ] a[0][1] a[0][1]
i n t ( ∗ p 1 ) [ 4 ] ; ∗ ( p 1 + 1 ) = a [ 1 ] int (*p1)[4]; *(p1+1) = a[1] int(∗p1)[4];∗(p1+1)=a[1]- a [ i ] [ j ] = ∗ ( p + i ∗ n + j ) = p [ i ∗ n + j ] a[i][j] = *(p+i*n+j) = p[i*n+j] a[i][j]=∗(p+i∗n+j)=p[i∗n+j]
- a [ 0 ] a[0] a[0]是一维数组的名字,指向 a [ 0 ] a[0] a[0]数组的首元素, ∗ a [ 0 ] *a[0] ∗a[0]得到的是一个数组元素值,即 a [ 0 ] a[0] a[0]数组首元素值,因此, ∗ a [ 0 ] = a [ 0 ] [ 0 ] *a[0] =a[0][0] ∗a[0]=a[0][0]
- a a a是一个二维数组的名字,它指向的是它所属元素的首元素,每一个元素都是一个行数组, a + i a+i a+i指向第 i i i个行数组,即 a [ i ] a[i] a[i]。 ∗ a = a [ 0 ] *a = a[0] ∗a=a[0]。 i n t ∗ p int *p int∗p;, p p p的指向一个 i n t int int型数据,而不是一个地址,因此, p = a [ 0 ] p=a[0] p=a[0]
- 行数组指针, i n t ( ∗ p 1 ) [ 4 ] ; int (*p1)[4]; int(∗p1)[4]; ( ∗ p 1 ) (*p1) (∗p1)为第一行数组指针,第一行有4个元素。 ∗ ( p 1 + 1 ) *(p1+1) ∗(p1+1) 为第二行
#include<stdio.h>
int main(){
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *p;
p = a[0];
//a的首地址,不能通过int **P ; p = a;将指针指向数组首地址,想通过指针可以使用*a,数组即指针
printf("a = %d, a[0] = %d, &a[0] = %d, &a[0][0] = %d, a = %d, *a = %d\n",a,a[0],&a[0],&a[0][0],a,*a);
//定义*p = a[0] ,后p所指向的值为数组首地址,即a[0]的值
printf("p = %d, *p = %d, (p+1) = %d\n",p,*p,*(p+1));
//a[1][0]的地址
printf("a+1 = %d, *(a+1) = %d, a[1] = %d, &a[1] = %d, &a[1][0] = %d\n",a+1,*(a+1),a[1],&a[1],&a[1][0]);
//访问a[0][0]元素值
printf("*p = %d,*a[0] = %d, **a = %d\n",*p,*a[0],**a);
//访问a[0][1]的值
printf("a[0][1] = %d, *(a[0]+1) = %d, *(*(a)+1) = %d, *(p+1) = %d\n",a[0][1],*(a[0]+1),*(*(a)+1),*(p+1));
//访问a[1][1]的值
printf("a[1][1] = %d, *(a[1]+1) = %d, *(*(a+1)+1) = %d\n",a[1][1], *(a[1]+1), *(*(a+1)+1));
//p访问二维数组元素
printf("a[1][2] =%d, *(p+1*4+2) = %d, p[6] = %d\n",a[1][2],*(p+1*4+2),p[6]);
//行数组指针,(*p1)为第一行数组指针,第一行有4个元素。(*p1+1) 为第二行
int (*p1)[4];
p1 = a;
printf("*p1 = %d,a = %d, *(p1+1) = %d, a[1] = %d\n",*p1,a,*(p1+1),a[1]);
printf("(*p1)[1] = %d, (*(p1+1))[2] = %d, *(*(p1+1)+2) = %d\n",(*p1)[1],(*(p1+1))[2],*(*(p1+1)+2));
return 0;
}
注:
- 指针变量的值可以改变,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
- 数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。