浅谈指针与数组

前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值