目录
知识点1【数组元素的指针】
案例:通过数组元素的指针变量 遍历 数组的元素
void test05()
{
int arr[5]={10,20,30,40,50};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
//p保存了 第0个元素的地址(首元素的地址)
int *p = &arr[0];
printf("*p = %d\n", *p);//10
p++;//p=p+1
printf("*p = %d\n", *p);//20
//前提是p保存的是第0个元素的地址
p=&arr[0];
for(i=0;i<n;i++)
{
//printf("%d ", arr[i]);
//p+i代表的是第i个元素的地址
//*(p+i)代表的是第i个元素的值
printf("%d ", *(p+i) );
}
printf("\n");
}
运行结果:
案例提高:
void test06()
{
int arr[5]={10,20,30,40,50};
int *p = &arr[1];
p++;
p++;
printf("%d\n", *(p+1));//50
}
运行结果:50
案例:通过数组元素的指针变量给数组的元素 获取键盘输入
void test07()
{
int arr[5]={0};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
int *p = &arr[0];
printf("请输入%d个int数据\n",n);
for(i=0;i<n;i++)
{
//scanf("%d", &arr[i]);
scanf("%d", p+i);//p+i == &arr[i]
}
for(i=0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
运行结果:
知识点2【数组的[]和*()的关系】(重要)
void test08()
{
//数组名arr 作为类型 代表的是数组的总大小 sizeof(arr)
//数组名arr 作为地址 代表的是首元素地址(第0个元素的地址)
int arr[5]={10,20,30,40,50};
int n = sizeof(arr)/sizeof(arr[0]);
int *p = NULL;
//p = &arr[0];//arr == &arr[0]
p = arr;
//在使用中 本质:[] 是*( ) 缩写
//缩写规则:+左边的值 放在[]左边边 +右边的值 放在[]里面
printf("arr[1]=%d\n",arr[1]);//20
printf("arr[1]=%d\n",*(arr+1));//20
printf("-------------------------\n");
printf("arr[1]=%d\n",*(1+arr));//20
printf("arr[1]=%d\n",1[arr] );//20
//为啥 arr代表的是 第0个元素的地址(&arr[0])
//&arr[0] == &*(arr+0) == arr+0 == arr
//所以:数组名arr代表第0个元素的地址
}
总结:
1、【】是*()的缩写
2、数组名arr 代表的是数组 首元素地址(第0个元素的地址)
知识点3【arr 和 &arr的区别】(了解)
arr:数组的首元素地址。
&arr:数组的首地址。
void test09()
{
int arr[5]={10,20,30,40,50};
printf("arr = %u\n",arr);
printf("arr+1 = %u\n",arr+1);
printf("-------------\n");
printf("&arr = %u\n",&arr);
printf("&arr+1 = %u\n",&arr+1);
}
运行结果:
数组名arr 是一个符号常量。不能被赋值。
void test10()
{
int arr[5]={10,20,30,40,50};
//arr=1000;//err arr符号常量 不能被赋值
//arr++;//arr=arr+1; err
arr+1;//ok
}
知识点4【指向同一数组的两个元素的指针变量 间关系】
void test11()
{
int arr[5]={10,20,30,40,50};
int *p1 = arr;
int *p2 = arr+3;
//1、指向同一数组的两个指针变量相减 返回的是相差元素的个数
printf("%d\n",p2-p1);//3
//2、指向同一数组的两个指针变量 可以比较大小 > < >= <= == !=
if(p2>p1)
{
printf(">\n");
}
else
{
printf("<=\n");
}
//3、指向同一数组的两个指针变量 可以赋值
p1=p2;//p1 和 p2指向同一处
//4、指向同一数组的两个指针变量 尽量不要相加
printf("p2=%u\n",p2);
//p1+p2;//err 越界很厉害了
//5、[]里面在不越界的情况下 可以为负数
printf("%d\n",p2[-2]);//20
}
案例:
void test12()
{
int arr[5]={10,20,30,40,50};
int *p = arr;
printf("%d\n", *p++);//10
printf("%d\n", (*p)++);//20
printf("%d\n", *(p++));//21
}