善用你的C(二)

原创 2004年07月01日 14:15:00

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

善用你的C(一)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 16:42
  • 156

善用你的C(一)

    上一篇文章写完之后感觉还算不错,因此我决定再写一些C的文章。    C语言从出生到现在恐怕是寿命最长是用的人数最多的一种语言了。他以其简洁的语法和较高的执行效率讲过程语言带到了最高峰,然而在出...
  • chunhuizhao
  • chunhuizhao
  • 2004年06月16日 15:21
  • 968

贵有恒,若事事勤思善问,何患不一日千里?--惭愧

想来备考已一月有余,踏实落地之物几无,何以至此,不恒,而后之时间,必争分秒,效率,练习思问,戒之,戒之。 曾国藩家训语录 勤字功夫,第一贵早起,第二贵有恒;凡将相无种,圣贤豪杰无种,只...
  • c_c123
  • c_c123
  • 2017年11月19日 10:00
  • 333

【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)

本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势。 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术。 ...
  • FancyVin
  • FancyVin
  • 2017年02月14日 01:22
  • 548

善领声音编辑器,修改search.dat完美启动静音

研究了好几天,总算把善领的search.dat文件格式Po了。 写了一个java程序,用来擦除善领启动音。程序比较简单,点击打开声音文件选择善领的search.dat文件,然后程序会自动解析文件格式...
  • feg545
  • feg545
  • 2016年03月19日 22:30
  • 1447

Android逆向工程实例 -- 善领安卓版DSA APP手势操作bug修复

善领官方网站发布的DSA软件(安卓版)及网络上流传的其他版本,均发现手势操作会导致进程崩溃的问题。查询相关网页信息都提出是官方软件本身的问题无法解决。         尝试使用逆向工程跟踪调试了一下...
  • u014183302
  • u014183302
  • 2014年11月19日 00:04
  • 3084

请回答1988-最后的德善旁白

岁月依然流逝 一切终将过去 年岁渐长 青春之所以美丽 恐怕这就是原因 在刹那的瞬间 耀眼闪烁之后 再也无法回去 双八年 我们双门洞的故事就此结束 怀念那个时期 怀念那个胡同 并不只是...
  • hgq_csdn
  • hgq_csdn
  • 2016年12月08日 18:59
  • 731

西川善司的3D图形技术概念和渲染管线的处理

from: http://psv.tgbus.com/news/ynzx/201305/20130528094843.shtml   3D图形技术概念和渲染管线的处理 一:3D图形的...
  • smsmn
  • smsmn
  • 2014年02月13日 13:33
  • 1222

天善智能网络爬虫学习~

#http://www.maoyan.com-榜单-top100,通过改变offset=10、20...这个参数实现翻页 #1、抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码...
  • yunini2
  • yunini2
  • 2017年07月10日 21:04
  • 136

夏娃的诱惑

前天晚上没有睡觉,用二天一宿看完了《夏娃的诱惑》。说真的,我并不很喜欢这部戏,但呆着总要做写什么的吧,就看它打发无聊的时间。     我是喜欢看日剧的,因为精彩,高潮叠起,比较起来,一般韩剧说感情的多...
  • pyp
  • pyp
  • 2004年07月13日 00:51
  • 1301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:善用你的C(二)
举报原因:
原因补充:

(最多只允许输入30个字)