目录
数组名与指针的区别
数组名 ———————— 不可变,是常量
指 针 —————————可 变,是变量
指针访问数组元素
先介绍一下数组,数组的 数组名就是一个地址(指针),它相当与数组的首地址。
#include <stdio.h>
int main()
{
int a[4] = { 1,2,3,4 };
int* p = a;
printf("%p\n%p\n%p\n",a,&a[0],p);
return 0;
}
通过上面的代码,我们可以看到数组a,a的值与&a[0]的地址相同,也就是说:p = a <==> p = &a[0]
指针变量的运算
当指针指向一个数组时,可以进行很多操作:
1.两个指针变量相减(可获得两个指针之间的数组元素个数)
例如:
#include <stdio.h>
int main()
{
int a[4] = { 1,2,3,4 };
int num = 0;
int* p1 = &a[0];
int* p2 = &a[4];
num = p2 - p1;
printf("%d\n",num);
return 0;
}
两个指针变量分别指向数组连续内存的不同变量,并让它们相减可得到两个指针之间的元素个数 。
2.指针与整数n进行相加,相减运算。(可以向上,向下移动指针)
#include <stdio.h>
int main()
{
int a[4] = { 1,2,3,4 };
int* p = &a[2];
printf("原指针为:%d\n", *p);
printf("向下移动一个指针:%d\n", *(p + 1));
printf("向上移动一个指针:%d\n", *(p - 1));
return 0;
}
3.指针变量可以++(自增),--(自减)运算
注意:(*p)++ 与 *p++ 的含义并不相同!!!
(*p)++ <==> a[i]++ 先取值,再变量自加。
*p++ <==> *(p++) 先取值,在地址自加。
补充:如果要打印 *(p)++ :会先打印*p的值,在做加加运算。如下图所示:
#include <stdio.h>
int main()
{
int arr[4] = { 1,4,3,2 };
int* p = arr;
printf("*p:%d\n",*p);
printf("*(p)++:%d\n", *(p)++);
printf("*p:%d\n", *p);
return 0;
}
指针、数组和地址的关系
例(一):
int *p , a[10];
若: p = &a[0]; (等价于 p = a )
说明指针指向a的首元素
例(二):
int a[5] = {1,2,3,4,5};
int *p = a;
表示a[i]的地址:&a[ i ] <==>p+i <==> a+i <==> &a[0]+i
表示a[ i ]的数组元素:
指针法:*(p+i) , *(a+i) , *(&a[ 0 ] + i ]
下标法:a[ i ] , p[ i ]
注意:运算时请不要下标越界 ! ! !
例(三):
使用指针遍历输入输出数组元素
1.指针法:
#include <stdio.h>
int main()
{
int arr[5] = {0};
int *p = arr;
printf("请输入5个整型数组元素\n");
for(p = arr; p <= arr + 4 ;p++)
scanf("%d",p); //p 为地址不用加取地址符&
printf("输出的结果为:\n");
for(p = arr; p < arr+5; p++)
printf("%d",*p); //输出的是值所以是*p
printf("\n");
return 0;
}
2.下标法:
#include <stdio.h>
int main()
{
int arr[5] = { 0 };
int* p = arr;
int i;
printf("请输入5个整型数组元素\n");
for (i = 0;i<=4;i++)
{
scanf("%d", p + i);
}
printf("输出的结果为:\n");
for (i = 0; i <= 4; i++)
{
printf("%d\t", *(p + i));
}
printf("\n");
return 0;
}
两者对比,可以看出下标法的可读性更高。
今天分享到这,下期指针与二维数组见!