前言
作为上个月刚学c语言的菜鸟,浅谈一下在数组和指针的学习中的心得,定有许多不到之处,还望各位看官海涵。
一。数组的创建与初始化
int arr[10]//这里定义了一个长度为10的数组,类型是int
int arr[]={1,2,3,4,5]//这里给数组的前5个位子赋值,这样写中括号里可以不用
//规定大小,默认为5
int arr[10]={1,2,3,4,5,]//剩余的5个位子会默认为0
int arr[]="aaqes"//也可以试着用其它类型的数组
二。浅谈数组
数组是什么,为什么要用数组
个人理解数组就像是如家宾馆的一排房间,这一层都是大床房,那一层都是双人房,(其中的元素数据类型相同),一旦创建大小不变,(从数组就是特殊的指针来看,似乎数组这个指针被施加了const)
在之前的学习中变量都是一个一个设出来的,可当遇到求平均数,求数列和的形式时,一个一个设变量未免太慢,所以就引入了数组,就相当于一下子开了好多个连续的房间,等待着后续的数据住进来
三。数组应用
排序
int a[]//定义一个数组
int n//定义数组的长度
int i,j,t; //定义三个变量
for (j=0;j<n-1;j++) //遍历一遍每一对相邻元素
{
for (i=0;i<n-1-j;i++)
{
if(a[i]<a[i+1])
{
t=a[i]; //a[i]与a[i+1]交换
a[i]=a[i+1];
a[i+1]=t;
}
}
}
求和
int x;
double sum =0
int i
int t=0
scanf("%d",&i);
if (i>0){ //判断用户输入数据是否有效
int arr[i];
scanf("%d",&x);
while(x!=-1){//最后输入-1使算法结束
arr[t]=x
sum+=x
t ++; //每次输入就换下一个房间
scanf("%d",&x);}
四。数组运算
遍历数组输出
void output(int *a,int n)
{
printf("\n");
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{int a[5]={2,1,4,5,3};
output(a,5);
}
寻找数字
int a[10];
int x;
int loc;
scanf("%d",&x);
loc=search(x,a,sizeof(a)/sizeof(a[0]));//用sizeof限制搜索长度
if(loc!=-1){
printf("%d",loc); }
else{printf("not found");}
int search(int key,int a[],int length)
{
int ret =-1;
int i;
for(i=0;i<length;i++)//遍历寻找
if(a[i]==key){
ret=i; //找到了则返回那个位置,否则返回-1,判断为没找到
break;
}
}
return ret;
}
五。指针浅谈
1.指针的创建与初始化
int *p//定义了一个指针
int **p//定义了一个二重指针,指针类型是int**,所指类型为int*
int *p[3]; //定义了一个数组,数组内的元素是指针
int (*p)[3];//定义了一个指针,指针指向一个数组
int i;
p=&i//初始化一个指针
2.指针是什么,为什么要用指针
在我理解看来,指针的本质就是一个地址,一个变量的地址。
如果说数组是一排房间的话,指针就是一个门卡房,也可以是一排门卡房,一个门卡可以开一个房间,也可以开一排房间,但我认为开一排房间的本质是开了第一个房间,从第一个房间里拿到了第二个房间的钥匙去开的第二个房间(指向数组首个单元)。
从函数的学习中了解到函数里是不能嵌套函数的,且函数只能返回一个数,而用指针做参数的函数的话,就可以直接通过修改底层那个地址里面的东西,实现多数据输出。而且通过回调函数,也可以在函数里在回调事件发生时调用回调函数。
3.&符和*符和指针运算
&符用于获取地址
*符用于访问地址
如
p=&b //&b是一个被取出来的地址,自然可以赋给指针
*p=b //*p是一个变量,自然可以被变量赋值
int **prt
*Prt=*p //**p指向的是指针的地址,那他的访问自然是一个指针
p是一个指针
p+1是什么意思呢,这不是p这个地址单纯的加1,而是加了一个1sizeof
值就取决于指针的类型,诸如int是4个字节,char是一个字节等
再回到之前的p+1,如果他是int,加一就是从之前的地址再加4个字节
如果他是char*,加一就是移动下一个字节。
六。指针与数组的关系
数组在我的理解看来,实际上是一种指针,但指针可以被重新赋值,而数组只能指它首个元素所在地址,不能随意改变。
即int *a
int *
int a []
int[]其实是等价的,都表示一个指向某地址的指针。