什么是直接访问?
通过变量的地址来存取变量的值(数组名)。
什么是间接访问?
通过存放变量地址的变量去访问变量(指针)。
我们简单了解一下指针,设一个变量a,并初始化指针
#include<stdio.h>
int main()
{
int a={};
int *p = a;//p指针所指向地址的值为变量a的值
return 0;
}
而今天我们要看的是指针和一维数组的关系,简单设一个一维数组a,并给它初始化
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
return 0;
}
区别在于:a是地址常量;p是指针变量。
要注意的是,千万不能给地址常量赋值!!!
1.用指针获取地址和取数组地址相同
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%p %p\n",a,a+1);//获取第一个元素 第二个元素的地址
printf("%p %p\n",p,p+1);//同样也是获取地址
return 0;
}
2.用指针获取元素和取数组元素相同
法一:
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d %d\n",*a,*(a+1));//获取第一个 第二个元素
printf("%d %d\n",*p,*(p+1));//同样也是获取元素
return 0;
}
法二:
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d %d\n",a[0],a[1]);//获取第一个 第二个元素
printf("%d %d\n",a[0],a[1]);//同样也是获取元素
return 0;
}
访问a[i]元素的值:
直接访问: *(a+i) a[i]
间接访问: *(p+i) p[i]
访问a[i]的地址:
直接访问: &a[i] a+i
间接访问: &p[i] p+i
接着我们引出一个经典错误
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",*a++);
return 0;
}
报错,是因为a是地址常量,前文说到,不能给地址常量赋值。
然后我们来讨论 *p++ , *(p++) , (*p)++ , ++(*p) , *++p , *(++p)它们之间的区别
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",*p++);//结果是2
printf("%d\n",*p);//结果是6
return 0;
}
对于* p++先取*p , 然后p自加;
指针指向第二个元素
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",*(p++));//结果是2
printf("%d\n",*p);//结果是6
return 0;
}
对于*(p++)先取*p , 然后p自加;
指针指向第二个元素
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",(*p)++);//结果是2
printf("%d\n",*p);//结果是3
return 0;
}
对于(* p)++先取 * p , 然后* p自加
*p 取到2,赋值。再加一,赋值。
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",++(*p));//结果是3
printf("%d\n",*p);//结果是3
return 0;
}
对于++(* p)先取 * p , 然后* p自加
*p 取到2,加一,再赋值。
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",*++p);//结果是6
printf("%d\n",*p);//结果是6
return 0;
}
对于*++p 先* p自加,取自加后指针指向的内容
指针取到第二个元素,赋值。
#include<stdio.h>
int main()
{
int a[5] = {2,6,4,8,5};
int *p = a;
printf("%d\n",*(++p));//结果是6
printf("%d\n",*p);//结果是6
return 0;
}
对于* (++p)先* p自加,取自加后指针指向的内容
指针取到第二个元素,赋值。