嵌入式学习之路(十二)——C语言学习(7)
前面我们已经讲了C语言用到最多的循环和分支语句,下面我们来讲将数组和指针吧。
1.数组:代表了内存中多个连续的数字,他要求每个存储位置的数据类型一样。
数组所对应的每个存储位置有一个编号,第一个编号为0,依次递增
那么什么是数组呢?我们来看看:
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
上面我们就定义了一个长度为10的数组,而且数组的元素是从1到0
而且arr[0] = 1;arr[1] = 2;以此类推a[9] = 0;这就是数组的表示方式
数组的优势:可以同时定义多个类型一样的数据
他的每个存储位置是连续的
而且想对数组里的元素进行读取的时候也方便
那么数组应该怎么用呢?我们可以来写个程序。
程序:1-从键盘读入10个数,每次只能读一个,全部读完后,逆序输出?
我们来分析这个程序,如果按照我们以前的方法,是不是就需要10个变量来存储我们的10个输入的数?int num1 = 0;int num2 = 0;......
而我们用了数组我们就可以int num[10] = {0};是不是方便很多呢
#include <stdio.h>
int main()
{
int num[10] = {0};
int i = 0;//循环变量
/*循环输入10个数*/
for(;i < 10;i++)
{
printf("请输入一个数");
scanf("%d",&num[i]);
}
for(i=9;i>=0;i--)
{
printf("%d ",num[i]);
}
return 0;
}
这样我们就可以对数组进行操作啦。是不是很方便呢?
2.指针:指针变量他本身也是一个变量,存放的是其他数据的地址。
int num = 0;//定义一个int类型的数
int *p_num = NULL;//定义一个存放int类型的数的地址
接下来就是把int类型的num的地址存放在p_num里,
p_num = #//把num的地址放在p_num里,这样我们想去操作num的时也可以通过p_num去找num,因为p_num里面存放了num的地址,有地址我们知道快递才可以送到指定的地方。
所以我们可以这样操作:
*p_num = 1;//通过p_num来操作num里面的数据,这个是允许的,我们可以把*理解成去到那个地址,到了那个地方我们当然可以改变这个地址里面的数啊,是不是不是很难理解呢?指针其实就是一个变量,他和其他变量不同的地方就在于他里面存放了别人的地址,可以去干预/帮助别人干事情。
也可以这样理解,num是张三的家,他的地址&num是文三路1号,而李四手里有问三路1号的钥匙,p_num = #他可以找到张三家,并且可以去到张三家(*p_num),去他家帮他干点事情。
有了这样的一个理解,我们就可以先干点事情看看。
程序:2-从键盘读入10个数,每次读一个,全部读完后,用指针逆序输出。
#include <stdio.h>
int main()
{
int num[10] = {0};//10个数的数组
int i = 0;//循环变量
int *p = NULL;
p = num;//把数组的首地址给指针变量p
for(;p < num+10;p++)
{
printf("请输入一个数");
scanf("%d",p);
}
p = num;//把p重新指向数组的首地址
for(i = 9;i>=0;i--)
{
printf("%d ",p[i]);
}
return 0;
}
从这个程序我们可以看到,
首先,地址也是可以加的,p++代表向后移动了与int一样的字节,跳到了下一个数组元素
其次,一个指针指向一个数组之后,我们发现他可以和数组一样使用p[i],但是在这之前,我们需要把p的指针重新指向num的首地址,为什么呢?因为上面我们移动了p,就表示p里面存放的地址已经变了,我们要想再对数组操作的话,我们需要重新将数组的地址赋给指针变量p。
今天我们就消化消化这个程序,如果这个程序能够理解并且能够写出来的话,说明我们才能学习后面的更加复杂的指针和数组的问题。我们就好好消化消化吧。