当前位置: 首页 > 科技观察

C语言核心数组与指针详解

时间:2023-03-20 10:55:38 科技观察

指针相信大家对下面的代码都不陌生:inti=2;int*p;p=&i;这是最简单的指针应用,也是最基本的用法。我们来熟悉一下什么是指针:首先,指针是一个变量,它存储的不是普通的数据,而是变量的地址。如上面代码中,整型变量i的地址信息保存在指针p中。接下来,让我们看看如何定义一个指针。由于指针也是变量,其定义与其他变量相同:例如:intp;是间接寻址或间接引用运算符。在上面的例子中,我们还看到了一个特殊的运算符&,它是地址运算符(&在其他合适的场合也是按位运算符,&&是交集运算符)。在上面的指针定义中,我们看到定义的是一个整型指针。指针还有类型吗?答案是肯定的,指针只能指向某种类型的对象,也就是说每个指针必须指向特定的数据类型(***例外:void类型的指针可以存储任何类型指针的对象,但是它不能取消引用自身。)。例如,int类型的指针绝不能指向char类型的变量。下面我们给出一个完整的例子来说明指针的简单应用:#includevoidmain(){inta,b,c,*p;a=1;b=3;p=&a;b=*p+1;c=*(p+1);printf("%d%d%d%d/n",a,b,c,*p+3);}运行结果为:12-8589934604这是一个完整的例子,大家可以自己上机调试,现在很多人使用MicrosoftVisualStudio开发环境,有些人不知道如何在这个开发环境下编写C程序和调试C程序,请参考附录.在上面的例子中,我们看到了这样两个表达式b=p+1;c=(p+1);前者表示将p指向的地址中的内容加到b中,相当于b=a+1;,后者是将p指向的地址加1,并将(p指向的地址赋值+1)到c。当然我们不知道p的下一个地址放的是什么,所以我们输出一个随机值(这样的操作是很危险的,切记不要使用不确定的内存地址)。Arrays数组大家应该都不陌生,用途非常广泛。inta[4]={2,4,5,9};该语句定义了一个4个空格的整数数组a并对其进行了初始化。关于数组的基础知识,可以参考其他相应的教材。这里主要讨论指针和数组的结合应用。让我们看一个完整的例子:#includevoidmain(){inta[4]={2,4,5,9};int*p;p=a;*p=*p++;printf("%d%d%d/n",*p,*p+6,*(p+1));}运算结果:4105分析:语句p=a;表示将数组a的第0个元素指针的地址赋值给指针p,数组名a表示数组a的第0个元素的地址。a[i]表示数组a的第i个元素,如果定义了指针p,则语句p=&a[0];表示指针p可以指向数组a的第0个元素,也就是说p的值是元素a[0]的数组Address。那么(p+1)指的是数组元素a[1]的内容,p+i是数组元素a[i]的地址,(p+i)指的是数组元素a[的内容我]。对数组元素a[i]的引用也可以写成(a+i)。可以得出&a[i]与a+i的含义相同,p[i]和(p+i)也是等价的。虽然数组和指针有很多共同点,但我们必须记住数组名和指针之间是有区别的。指针是一个变量,所以语句p=a和p++都是合法的。但是数组名不是变量,所以类似于a=p和a++的语句是非法的。我们来看一个常用的函数strlen(char*s):intstrlen(char*s){intn;for(n=0;*s!='/0';s++)n++;returnn;}因为s是一个指针,所以对其进行自增操作是合法的。执行s++操作不会影响strlen函数调用者中的字符串,只是对strlen函数中指针的私有副本进行自增操作。在函数定义中,形参chars[]和char*s是等价的。让我们再看一下地址算法:如果p是一个指向数组中元素的指针,那么p++将递增p并指向下一个元素,而p+=i将递增pi,使其指向第i个指针p当前指向的元素之后的元素。与其他类型的变量一样,指针可以被初始化。一般来说,指针唯一有意义的初始化值是0或表示地址的表达式,在这种情况下,表达式表示的地址必须是先前定义的适当类型数据的地址。比较任何指向0的指针是否相等是有意义的。但是指向不同数组元素的指针之间的算术或比较操作是没有意义的。指针也可以与整数相加或相减。例如p+n表示指针p当前指向的对象之后的第n个对象的地址。不管指针p指向的对象是什么类型,上面的结论都是成立的。在计算p+n时,n会根据p指向的对象的长度进行缩放,这取决于p的声明。比如int类型占用4个字节的存储空间,那么int类型在计算中对应的n就会被计算为4的倍数。指针减法也是有意义的。如果p和q指向同一个数组中的元素,并且p#includevoidmain(){inti;charb[]={"wustrive_2008"};char*a[1];*a=b;for(i=0;iintstrlen(char*s){char*p=s;while(*p!='/0')p++;returnp-s;}voidmain(){inti;charb[]={"wustrive_2008"};char*a[1];*a=b;for(i=0;i