对象在内存中所占存储空间的其实地址称为指向该对象的指针, 从本质上讲,指针就是地址
指针变量是指保存其他对象内存地址(指针)的变量(是“指针类型”的变量)。(一般情况下存放用户自定义的变量的地址,或者用户自己申请的内存空间的首地址)
指针的运算
1.取地址运算——&
&是一个单目运算符,用于获取存储单元的首地址,称其为取地址运算。
2.引用目标运算符——*
*是一个单目运算符,用于对某一指针所指目标进行访问,称其为引用目标运算。(这种运算只能加在指针类型的数据上)
数组名与指针是完全相同的数据类型,它们之间的运算是通用的。区别仅在于数组名是指针常量而已。
main()
{
int a[10],*p=a,i;
for (i=0;i<10;i++)
scanf("%d",p++);
for (i=0;i<10;i++)
printf("a[%d]=%d\n",i.a[i]);
for (i=0;i<10;i++)
printf("*(a+%d)=%d\n",i,*(a+i));
}
用指针的方法 实现将数组中的 元素颠倒放置
main()
{
int a[10],i,t,*p=a,*q=a;
printf("\n");
for (i=0;i<10;i++)
scanf("%d",p++);
for(p--;q<p;p--,q++)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
printf("\n");
for (i=0;i<10;i++)
printf("%d",a[i]);
}
在一维数组和二维数组中,a+i和*(a+i)的含义不同。在一维数组中a+i表示数组a的第i个元素地址,而*(a+i)为数组a中第i个元素的值;在二维数组中,a+i和*(a+i)都表示地址,其中a+i表示数组a的第i行首地址,而*(a+i)表示a数组中第i行第0列元素的地址。
用数组元素偏移量访问数组
main()
{
int a[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
int i,j;
for (i=0;i<3;i++)
{
for (j+0;j<4;j++)
printf("a[%d][%d]=%-5d",i,j,*(a[0]+i*4+j));
}
}
/*表达式a[0]+i*4+j表示第i行第j列元素的地址,因此*(a[0]+i*4+j)就是元素a[i][j]*/
*(a[0]+i*4+j)不能写成*(a+i*4+j),因为a所指对象是行,a+i*4+j表示从a开始跳过i*4+j行所得到的地址;而a[0](即*(a+0))所指的对象为元素,所以a[0]+i*4+j表示从a[0]开始跳过i*4+j个元素所得到的地址(即a[i][j]的地址)
指针 | 意义 |
int *p; | p为指向整型量的指针变量 |
int *p[n]; | p为指针数组,由n个指向整型量的指针元素组成 |
int (*p)[n]; | p为指向整型一维数组的指针变量,一维数组的大小为n |
int *p(); | p为返回指针值的函数,该指针指向整型量 |
int (*p)(); | p为指向函数的指针,该函数返回整型量 |
int **p; | p为一个指向另一指针的指针变量,该指针指向一个整型量 |