上一篇文章地址:http://blog.csdn.net/qmhlan/article/details/6640481(指针系列)
下面介绍指针与数组的关系
指向一维数组的指针
指向多维数组的指针
指向字符串的指针
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.