让你不再害怕指针的应用-全程仿真+注解(第二部分:数组)(持续更新)
写此文章一是为了分享,二是为了温习!
预计包含的内容为:变量如int 、数组 、结构体 、枚举 、联合体、(这个自己也在了解)。
软件:CODE::Blocks Compiler:GCC5.1.0
写第二部分就默认大家看了我写的之前的文章,那我就直接阐述我的观点和仿真结果!
重要的五句话:好好揣摩!
指针的值: 是它所指向对象的地址
在指针前面使用*可以得到:指针所指向对象的值(简称:取内容)
指针+1,指针的值递增它所“指向类型”的大小
数组的指针:指的是:数组的起始地址。
数组元素的指针:指:数组元素的地。
把数组的地址 赋给指针变量 :该指针就指向该数组了!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<windows.h>
int b = 0;
int c ;
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p_1,*p_2;
p_1 = &a;//数组名就是改数组的首地址
p_2 = &a[0];//取a的首地址,性质和上面一样。
printf("p_1= %d\n",*p_1);
printf("p_2= %d\n",*p_2);
printf("a= %d\n",a);
printf("取内容p_1= %d\n",*p_1);
printf("去内容p_2= %d\n",*p_2);
getch();
}
结果:
总结:由上面上来讲,取数组[0]的地址,取a的地址或者直接打印出来的都是一个地址,说明这三种方法都可以得到数组的地址!
为什么这么做呢?C Primer Plus书籍 有这么一句话我抄下来供阅读一下!
指针提供一种以符号的形式使用地址的方法。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要表达的指令以更接近机器的方式表达。所以使用指针更有效率!
那么你就会发现一个问题,如果指针*(p_1+1),*(p_1+1) 取出来的内容是什么呢?是不是乱码还是自己想要的数据呢?
想要得到这个问题的答案,我们先看看指针(p_1+1),(p_1+1)打印出来的是什么呢?我还想表达另一个问题,故改了一下程序!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<windows.h>
int b = 0;
int c ;
int main()
{
int a[3] = {1,2,3};
double b[3] = {4,5,6};
int *p_1;
double *p_2;
p_1 = &a;//数组名就是改数组的首地址
p_2 = &b;
printf("p_1= %d\n",(p_1));//打印数组的首地址
printf("p_2= %d\n",(p_2));
printf("p_1+1= %d\n",(p_1+1));//打印指针指向的下一个地址
printf("p_2+1= %d\n",(p_2+1));
getch();
}
结果:
结论:p_1= 6356732 p_1+1= 6356736 p_1= 6356704 p_1+1= 6356712 ,一个int型的变量占用4个字节,一个double占用8个字节。之前是讲过的,不再赘述。说明指针指向下一个地址是可以确定的,为什么p_1+1指向的地不是6356733呢?也加1呢?
这么高深的问题,C Primer Plu书籍 来给你解答:我们的系统地址是按字节编地址的,在C语言中,指针+1指的是增加一个储存单元,int的储存单元是4个字节,那么pointer+1也就指向下一储存单元了。
这是为什么必须声明的所指向对象类型的原因之一。只知道地址不够,因为计算机要知道存储对象需要多少字节(即使指针所指向的是标量变量,也要知道变量的类型,否则*poiner+1就无法正确取回地址上的值。
明白了这个指针+的问题,我们开始取数组里面的内容,并且改变数组里面的值。那不是轻而易举,哈哈!看程序
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<windows.h>
int b = 0;
int c ;
int main()
{
int a[3] = {1,2,3};//初始化数组
double b[3] = {4,5,6};
int *p_1;
double *p_2;
short i,j;
p_1 = &a;//数组名就是改数组的首地址
p_2 = &b;
for(i=0;i<3;i++)
{
*(p_1+i) = 100+(i*100);//循环修改数组元素的值
}
for(i=0;i<3;i++)
{
*(p_2+i) = 400+(i*100);;//循环修改数组元素的值
}
for(i=0;i<3;i++)
{
printf("p_1+%d= %d\n",i,*(p_1+i));//打印数组的数据
}
for(j=0;j<3;j++)
{
printf("p_2+%d= %f\n",j,*(p_2+j));//打印数组的数据
}
getch();
}
结果:
最后我们了解数组的地址,和指向数组的指针的地址的递增方式,并也会运用指针取内容,改变变量的值。等等等,我这边没有涉及到取地址,因为取地址不是很难理解。
&a 取a的地址,这个地址指针可以指向这个地址;
哈哈,不难吧!
结语:
很多事情学会了就不难了,就比如初中生看小学的知识,高中看初中知识一样!
写文章,有很多不足之处,请体谅!我也是边学别用!