C语言指针学习(4)指针和数组
程序员文章站
2024-01-03 08:41:10
...
一、回顾数组的知识
定义数组:int a[4]={1,2,3,4};
代码验证如下
&a[0]=a+0均代表数组a第0个元素的地址
a=&a[0]=a+0
数组第0个元素的地址=数组首地址=a=&a[0]=a+0;
第1个元素的地址:a+1=&a[1]
第2个元素的地址:a+2=&a[2]
第3个元素的地址:a+3=&a[3]
a[0]=*(a+0)均代表数组a第0个元素的数值
例如:int a[4]={1,2,3,4};
a[2]
(1) 先求第2个元素地址:a+2
(2) 根据地址取出值:*(a+2)
结论:
第0个元素的值=a[0]=*(a+0)=1
第1个元素的值=a[1]=*(a+1)=2
第2个元素的值=a[2]=*(a+2=3
第3个元素的值=a[3]=*(a+3)=4
运行结果
对上面进一步进行补充,计算数组的长度,将数组元素值扩大10倍,打印数组元素内容
a[i]=*(a+i)均代表取值
运行结果
上面两个整合后代码如下:
int main()
{
int a[4]={1,2,3,4};
int length=sizeof(a)/sizeof(a[0]);
printf("a的地址是%p\n",a);
printf("第0个元素的地址是%p,%p\n",&a[0],a+0);
printf("第1个元素的地址是%p,%p\n",&a[1],a+1);
printf("第2个元素的地址是%p,%p\n",&a[2],a+2);
printf("第3个元素的地址是%p,%p\n",&a[3],a+3);
printf("*****************\n");
printf("第0个元素的值是%d,%d\n",a[0],*(a+0));
printf("第1个元素的值是%d,%d\n",a[1],*(a+1));
printf("第2个元素的值是%d,%d\n",a[2],*(a+2));
printf("第3个元素的值是%d,%d\n",a[3],*(a+3));
printf("*****************\n");
printf("&a[3]-a的值是%d\n",&a[3]-a);
for(int i=0;i<length;i++){
*(a+i)*=10;//元素值扩大10倍
}
for(int i=0;i<length;i++){
printf("第%d个元素的值是%d,%d\n",i,a[i],*(a+i));
}
}
运行结果:
二、指针变量和数组的关系(公式)
1、通过指针变量访问数组的写法1:
pa[i]=*(pa+i)均表示取数组元素的数值
sizeof(a)/sizeof(a[0])//计算数组元素个数
int a[4] = {1,2,3,4};
int *pa = a;//指针指向数组首地址
int lenght = sizeof(a)/sizeof(a[0]);//计算数组元素个数
//读查看
for(int i = 0; i < lenght; i++) {
printf("%d, %d\n", pa[i], *(pa+i));//用两种读取数据方式打印内容
}
//写修改
for(int i = 0; i < lenght; i++) {
*(pa + i) *= 10;//将数组元素扩大10倍
pa[i] *= 10;//使用另一种方式将数组元素扩大10倍
}
2、通过指针变量访问数组的写法2:
int a[4] = {1,2,3,4};
int *pa = NULL;
int lenght = sizeof(a)/sizeof(a[0]);
//读查看
for(pa = a; pa < a + lenght; pa++) {
printf("%d\n", *pa);
}
//写修改
for(pa = a; pa < a + lenght; pa++) {
*pa *= 10;
}
3、注意:
4、终极公式:a[i] = *(a+i) = *(pa+i) = pa[i](取元素的值)
**
三、例程
**
(1)将数组元素值扩大(缩小)
(2)*pa++计算过程是如何的呢?
*pa++是先计算 * 还是先计算++呢?
*pa++计算的过程是先算 * 然后在计算++
如果先计算了pa++则表示地址加1,表示指向了下一个地址,再计算 (pa++)就不是将数组元素值扩大10倍 了,而是取下一个元素的数值,所以是先计算 * 再去计算++
运行结果
(3)指针做相减运算得到的是相差元素的个数,实际地址相差元素个数数据类型
运行结果如下
综合代码如下
#include<stdio.h>
int main()
{
int a[]={1,2,3,4};
int length=sizeof(a)/sizeof(a[0]);
//写法1
int *pa=a;
for(int i=0;i<length;i++){//写修改
*(pa+i)*=10;
pa[i]*=10;
}
for(int i=0;i<length;i++){//读查看
printf("%d %d\n",pa[i],*(pa+i));
}
//写法2:
for(pa=a;pa<a+length;pa++){//写修改
*pa/=100;
}
for(pa=a;pa<a+length;pa++){//读查看
printf("%d\n",*pa);
}
//写法3
for(pa=a;pa<a+length;){//写修改
*pa++*=10;//先算*,再算pa++
}
for(pa=a;pa<a+length;){//读查看
printf("%d\n",*pa++);
}
int *p1=&a[1];//p1指向第一个元素,p1保存第一个元素的地址
int *p2=&a[3];//p2指向第三个元素,p2保存第三个 元素的地址
printf("p2-p1=%d\n",p2-p1);//相差2个元素
return 0;
}
运行结果如下