通过指针引用数组
数组元素的指针
数组指针:
数组中第一个元素的地址,也就是数组的首地址
指针数组:
用来存放数组元素地址的数组,称之为指针数组
// 定义一个一般数组
int a[] = {1,4,9};
// 使用指针变量存储数组的第一个元素的首地址,也就是数组的首地址
int *p = &a[0];// 数组首地址
// 在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。
int *p = a;
// 意味着:int *p = &a[0] 完全等价于 int *p = a;
printf("%d\n",*p); // 1
注意:虽然我们定义了一个指针变量接收了数组地址,但不能理解为指针变量指向了数组,而应该理 解为指向了数组的元素。
在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。
指针的运算:
指针运算:指针变量必须要指向数组中的某个元素
序号 | 指针运算 | 说明 |
1 | 自增:p++,++p,p=p+1(p+=1) | 让指针变量指向下一个元素 |
2 | 自减:p--,--p,p=p-1(p-=1) | 让指针变量指向上一个元素 |
3 | 加一个数:p+1 | 下一个元素的地址 |
4 | 减一个数:p-1 | 上一个元素的地址 |
5 | 指针相减:p1-p2 | P1,p2之间相差几个元素 |
6 | 指针比较:p1<p2 | 前面的指针小于后面的指针 |
分别说明如下:
⑴ 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的 下一个元素,p-1指向同一数组中的上一个元素。即p+1或p-1也表示地址。但要注意的是,虽然指针变量p中存放的是地址,但p+1并不表示该地址加1,而表示在原地址的基础上加了该数据类型所占的字节数d 。
⑵ 如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a[1]。d是数组元素占的字节数。
⑶ 如果p的初值为&a[0]则p+i 和a+i 就是数组元素a[i]的地址,或者说,它们指向a数组的第 i 个元素 。
(4) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
⑸ 如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度d。
案例1:
#include <stdio.h>
int main()
{
// 一般数组
int a[] = {1,3,5,7,9};
// 计算数组中元素的个数
// sizeof用法:sizeof(运算数) 或者 sizeof 运算数
int len = sizeof a / sizeof a[0];
// 创建指针变量
int *p = a;
// 创建循环变量
register int i = 0;
// 遍历
for(;i < len; i++)
{
printf("[1] %d ",a[i]); // 下标法
printf("[2] %d ",*(a+i));// 指针法,但是这种写法,需要注意,a+i无法修改数组,只读
printf("[3] %d ",*(p+i));// 指针法,这种更为灵活,可读可写,建议这种写法
p++;
// printf("%d\n",*p); // 等价于上面写法
// p++;
}
printf("\n");
return 0;
}
案例2:
#include <stdio.h>
int main()
{
int a[] = {10,22,33,44,55,66,77,88};
int *p = a;// 等价于 int *p = &a[0] 元素:10
p++;// 指针+1,元素值不改变 元素:22
printf("%d\n",*p);// p = p + 1 元素:22
int x = *p++;// x = 22,p++ -- *p:33
printf("%d,%d\n",x,*p);// *p++:先*p,在p++, 元素:22,33
int y = *(++p);// ++p, y = 44;
printf("%d,%d\n",y,*p); // *(++p):先p++,再*p,元素:44,44
(*p)++;// 元素值+1,指针不改变
printf("%d\n",*p);// index为3的元素值:44 + 1 = 45
return 0;
}
数组名做函数参数
如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种情况:
- 形参和实参都用数组名
- 实参用数组名,形参用指针变量。
- 实参形参都用指针变量
- 实参为指针变量,形参为数组名。
void fun(int *p1){}
void main()
{
// 注意:如果实参和形参都是指针,我们的实参需要初始化
int arr[2] = {23,34};
int *p0 = arr;
fun(p0);
}
案例1:
/**
* 需求:将数组a中n个整数按相反顺序存放。
*/
#include <stdio.h>
/* 数组的反转:数组实现*/
void inv(int arr[],int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp
int i = 0,temp;
// 遍历数组
for(;i < len/2;i++)
{
// 交换
temp = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = temp;
}
}
/*
数组的反转:指针实现
关键字:const 给变量的数据类型前面添加const,代表这个变量是只读变量,无法对此作出修改
*/
void inv2(int *arr,const int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp *j = &arr[len -1] 等价于 arr + len -1
int *i = arr,*j = &arr[len-1],temp;
// 遍历数组
for(;i < j;i++,j--)
{
// 交换
temp = *i;
*i = *j;
*j = temp;
}
}
int main()
{
int array[10] = {12,23,45,55,66,77,88,26,34,32};
int len = sizeof(array)/sizeof(int);
inv2(array,len);
// 测试是否反转
for(int i = 0;i < len;i++) printf("%d,",array[i]);
printf("\n");
return 0;
}
标签:int,元素,len,嵌入式,++,初学,数组,C语言,指针
From: https://blog.csdn.net/MaBaB/article/details/141096667