欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈指针与数组

程序员文章站 2023-12-25 23:03:51
...

前言

作为上个月刚学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[]其实是等价的,都表示一个指向某地址的指针。

上一篇:

下一篇: