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