什么是数组元素的指针
- 一个变量有一个地址,一个数组包含诺干个元素,每个数组元素都有相应的地址
- 指针变量可以指向数组任意元素
- 数组元素的指针就是数组元素的地址
让指针指向数组的首地址
- 如果指针已经指向了一个元素,让指针+1/-1指向元素+1/-1
#include<stdio.h>
void main()
{
int a[] = {44,87,9,55,25,66,12};
int *q;
q = a;
printf("%d\n",q);//首地址原元素 6356688
printf("%d\n",q+1);//6356692
}
q-1越界了
- 数组a[i]的地址表示方式
#include<stdio.h>
void main()
{
int a[] = {44,87,9,55,25,66,12};
int *q,i;
q = a;//吧a的首元素地址赋给指针变量q
for(i=0;i<7;i++)
{
printf("%d\n",&a[i]);
printf("%d\n",a+i);//数组名a不代表整数数组,代表首元素地址,
printf("%d\n",q+i);
printf("%d\n",&q[i]);
}
}
- a[i]值4种表示方法
#include<stdio.h>
void main()
{
int a[] = {44,87,9,55,25,66,12};
int *q,i;
q = a;
for(i=0;i<7;i++)
{
printf("%d\n",a[i]);
printf("%d\n",*(a+i));
printf("%d\n",*(q+i));
printf("%d\n",q[i]);
}
}
- a和q有着本质的区别; a是指针常量,值不可变;q是指针变量,其值可变,所以
- a++,a= q都是非法的
- q++,q=a是合法的
#include<stdio.h>
int main()
{
int a[6] ={77,855,12,0,1,9},*q,*p;
p = a;
q = a+5;
printf("%d\n",p);//6356688
printf("%d\n",a);//6356688
printf("%d\n",p+1);//6356692
printf("%d\n",*(a+1));//855
printf("%d\n",*(p+1));//855
printf("%d\n",a[1]);//855
printf("%d\n",p[1]);//855
printf("%d\n",&p[1]);//6356692
}
- 两个指向同一数组的指针相减,就是相隔的元素个数
#include<stdio.h>
int main()
{
int a[6] = {0,10,20,30,40,50},*p,*q;
p = a;
q = a+5;
printf("%d\n",p);//6356688
printf("%d\n",q);//6356708
printf("%d\n",q-p);//5
}
#include<stdio.h>
int main()
{
int a[6] = {0,10,20,30,40,50},*p,*q;
p = a;
q = a+5;
printf("%d\n",*p);//0
printf("%d\n",*q);//50
printf("%d\n",q-p);//5
}
- 自增和自减运算
- *和++ --的优先级相同,自右向左运算
int a[6] = {0,10,20,30,40,50},*p;
p = &a[0];
printf("%d\n",*p);//0
printf("%d\n",*++p);//10 *(++p)
printf("%d\n",*p++);//0
printf("%d\n",(*p)++);//0
printf("%d\n",++(*p));//1
#include<stdio.h>
int main()
{
int a[6] = {0,10,20,30,40,50},*p;
p = &a[0];
printf("%d\n",*p++);//0
printf("%d\n",*p);//10
}