善用你的C(二)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

前一篇文章讨论了表达式的用法,其中很多网友都指出最后一个例子有问题a&0x80这里面的a是16位。我当

时也是疏忽,不过细想起来如果a的取值范围在-127和127之间这样写是没有问题的,因为除了最后8位之外前面

的位和符号位应该是一样的,但介于维护的方便大家最好还是不要这样写。

下面我们进入本文的主题——指针的探讨。指针是C中最突出的功能之一,如果不能灵活的运用指针就不能

写出好的C程序。

指针就是存储内存地址的一个存储单元。下面我们来讨论一下指针变量和指针常量。先看一个例子:

#include

void main()

{

int a=5;

int *p=&a;

printf("p=%d\n",p);

printf("&a=%d\n",&a);

p++;//编译通过

(&a)++;//错误

}

我们可以看出p和&a的值是相等的,这说明p和&a是同一个地址,但(&a)++为什么会出现错误呢?这是因为&a只

是一个常量它并没有存储到变量中去,所以我们不能给他赋值。如果想让一个指针变量不可改变只要在定义是

加上const就可以了。

另外,我们在定义函数的时候会希望利用指针来直接改变实参的值,例如:

#include

void add(int *a,int b);

void main()

{

int a=5,b=2;

add(&a,b);

printf("p=%d\n",a);//a等于7

}

void add(int *a,int b)

{

*a=*a+b;

}

这样就可以直接改变a的值。然而如果我们不想通过指针改变值时也可以用const,这种情况在用数组作为参数

时经常用到。

#include

void add(int *a);

void main()

{

int a[2]={5,2};

add(a);

printf("a[0]=%d,a[1]=%d\n",a[0],a[1]);//a[0]等于7

}

void add(int *a)

{

*a+=*(a+1);

}

在这里我们并没有使用const,数组元素的值被改变了。很多时候我们不想改变数组的值,我们只要这要写:

#include

int add(int const*a);

void main()

{

int a[2]={5,2},result;

result=add(a);

printf("result=%d\n",result);

printf("a[0]=%d,a[1]=%d",a[0],a[1]);

}

int add(const int *a)

{

return *a+*(a+1);

}

这个const就可以防止我们以外的修改了数组里的元素。

既然上面提到了数组,我们就来数组和指针的关系。数组是一连串位置相邻的存储空间。数组在表示上是

用 数组名[下标] 来表示的,但这种表示方法并不是仅限于数组,任何连续的存储空间都可以用下标来访问

。举个例子:

#include

#include

void main()

{

int *p=malloc(8);

p[0]=5;

p[1]=2;

printf("p[0]=%d,p[1]=%d\n",p[0],p[1]);

printf("p=%d,p+1=%d",&p[0],&p[1]);//从这里可以看出两个指针是相邻的

free(p);

}

从这个例子我们可以看出,p[1]就相当于*(p+1)的简写。

最后我们再说一说字符串在C中的用法。字符串实际上是一个字符数组,使用字符串就和使用数组一样。字

符串同样可以用下标来访问:

#include

void main()

{

char str[]="this is a string";

int i;

for(i=0;i<17;i++)

printf("%c",str[i]);

printf("\n");

for(i=0;i<17;i++)

printf("%c","this is a string"[i]);

}

好了,对指针的介绍就到这里,下一篇文章我们来讨论C中的多态性。 2004.7.1

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航