指向一维数组的指针变量
(1)p+i和a+i就是a[i]的地址
(2)*(p+i)或*(a+i)就是其所指向的元素
(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价
#include <stdio.h>
main()
{
int a[4]={1,2,3,4};
printf("%d",*a); //输出结果为1 ,输出的是a[0]的值
}
#include <stdio.h>
main()
{
int a[4]={1,2,3,4};
printf("%d",*(a+0)); //输出结果为1 ,输出的是a[0]的值 ,总之a+n,n为数列中第几个的值
}
#include <stdio.h>
main()
{
int a[4]={1,2,3,4};
int i;
for(i=0;i<4;i++)
printf("%d",*(a+i)); //输出结果为1234
}
自增、自减运算符和指针运算符
#include <stdio.h>
main()
{
int a[5]={1,2,3,4,5},*p;
p=a;
printf("%d",*p); //输出结果为1
printf("\n");
p=a; //让指针变量复位,指向首地址
printf("%d",*(p++)); //输出结果为1
printf("\n");
p=a;
printf("%d",*(++p)); //输出结果为2
printf("\n");
p=a;
printf("%d",++*p); //输出结果为2
printf("\n");
p=a;
printf("%d",(*p)++); //输出结果为2
}
指向多维数组的指针变量
#include <stdio.h>
main()
{
int a[2][3]={{1,2,3},{4,5,6}},*p;
int i;
for(p=*a;p<*a+2*3;p++) //*a+[2]*[3]为其元素地址格式
printf("\n%d",*p); //输出结果为123456
}
#include <stdio.h>
main()
{
int a[2][3]={{1,2,3},{4,5,6}},*p;
int i,j;
scanf("%d",&i);
scanf("%d",&j);
p=a[0];
printf("%d",*(p+i*3+j)); //元素地址格式
}
#include <stdio.h>
main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int(*p)[3];
int i,j;
scanf("%d",&i);
scanf("%d",&j);
p=a;
printf("%d",*(*p+i)+j);
}
(1)p=a,将二维数组的首地址赋给了p。p加法的单位为3个单元,因此p+i等价于a+i,*(p+i)
等价于*(a+i),即a[i][0]的首地址。
(2)*(p+i)+j
等价于&a[i][0]+j,即a[i][j]的地址
(3)*(*(p+i)+j)
等价于(*(p+i))[j],即a[i][j]的值
指向指针的指针
如果一个指针变量存放的又是另一个指针的地址,则称这个指针变量为指向指针的指针变量
#include<stdio.h>
int main()
{
char *name[]={"a","b","c","d","e"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s",*p); //结果为abcde
}
}