分享
 
 
 

善用你的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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有