在上一篇文章中,我说了一些关于指针的基础内容,那么这篇文字里,我将会把我对指针的细致的了解写下来
既然指针是用来存放不同数据类型的地址的,所以他可以有如下几种类型。
char*类型的指针是为了存放char类型变量的地址
short*类型的指针是为了存放short类型变量的地址
int*类型的指针是为了存放int类型变量的地址
用不同的类型指针,可以方便的让计算机开辟不同的数据空间,也方便了用户存放数据。
因为指针也是变量,所以它也可以作为一个数据存储在另一个地址里面,而这个存放地址的地址的变量,就叫做二级指针变量。
二级指针的形式和一级指针差距不大 形如(**ppa)这就是一个二级指针,a的地址存放在pa中,而pa的地址存放在ppa中
下面写一段代码,你们可以从中看出二级指针的作用。
int b=20;
*ppb=&b;
**ppb=30;
在这块,定义了一个整型变量b,并且·赋值为20,再将b的地址取出来,放在pb里面,然后再把pb的地址取出来放在ppb里面,所以,**ppb访问的变量就是b的值,也就说**ppb的值为20,这时候,当**ppb赋值为30的时候,就相当于将b的值修改为30了。
指针有个很有意思的地方,他可以访问超出数据范围的数据,但是只允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置进行比较,不允许与指向第一个元素之前的数据进行比较。所以,在用指针进行数组元素比较的时候,尤其应该注意,大多数时候,我们应该遵循从前向后的顺序进行比较,这样可以避免出现不必要的错误。而在这,有一个相同点就是,数组也可以进行元素越界,比如说定义一个长度为10的数组a[9],当你要访问数组第十二个元素的时候,vs2008会成功编译,也不会报错,但是也仅限这种情况,超出12之后,程序就会跑不起来了,所以,也应该尤其注意,当你使用数组或者指针的时候,千万不要下标越界,有时候程序不报错,你自己也会很难找到错误出现在哪里。
指针经常运用在数组的操作上,比如数组的逆置,转换,连接,比较,还有常用的冒泡排序法,都可以用指针来解决,而且,指针解决这些问题的效率是很高的,因为它是直接指向数据所在的地址空间的,计算机可以直接访问到数据所在的地址,大大减少了所需的时间。 那么接下来,我就附上一段用指针的方式来解决的问题吧。
指针逆置数组元素
#include<stdio.h>
#include<stdlib.h>
inverte(int *x,int n) //创建自定义函数inverte
{
int *p,temp,*i,*j,m=(n-1)/2; //声明变量
i=x; //存放首元素的地址
j=x+n-1; //存放数组末尾元素的地址
p=x+m;
for(;i<=p;i++,j--) //交换数组前半部分和后半部分的元素
{
temp=*i;
*i=*j;
*j=temp;
}
return 0;
}
void main()
{
int i,a[10]=
{
1,2,3,4,5,6,7,8,9,0
};
printf("The elements of original array:\n"); //定义数组
for(i=0;i<10;i++)
printf("\n");
inverte(a,10); //使数组元素逆置
printf("The elements have been inverted:\n");
for(i=0;i<10;i++)
{
printf("%d",a[i]);
printf("\n");
getch();
system("pause");
}
}
这段代码,定义了一个头指针和一个尾指针,然后把数组元素分为前后两个部分,通过一个for循环,让头指针给后走,尾指针给前走,在指针移动的过程中,把指针所在元素的数据进行交换,这样一来,总共循环五次,就可以完成数组的逆置。
关于指针,我们还会在很多地方见到它,我相信,不断地练习,我们会熟练地使用这个工具来帮助我们更好的编程的。