CSDN博客

img chunhuizhao

善用你的C(二)

发表于2004/7/1 14:15:00  1020人阅读

??? 前一篇文章讨论了表达式的用法,其中很多网友都指出最后一个例子有问题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

0 0

相关博文

我的热门文章

img
取 消
img