第一章 指针常识

和C语言中任何一个部分一样,指针也有其基本的常识。本文不会介绍太多基础的东西,关于指针的常识模块也只是一带而过,如有遗忘,请参考相关书籍。

1.1 变量

变量常常出现于表达式中,当变量出现在表达式的左方时,它表示的是某个地址;而当变量出现在表达式的右方时,它表示的是某个地址里存放的值。例如:

int a = 1; 
int b =2; a = b;

其中a = b;中的a表示的是a的地址空间,而b表示的是b的地址空间中的内容。a = b则表示将a的地址空间的修改成b的地址空间中的内容。简而言之,对于变量来说,出现在赋值表达式的左边则表示引用其地址,出现在赋值表达式的右边则表示引用其值。整个表达式的意思就是,把某个地址里的内容修改成后面的内容。判断一个赋值表达式是否合法就看赋值的左边是否是个地址,而右边又是否是个值。

1.2 指针初始化

定义一个指针只是向编译器申请一个用于存放某个地址的地址空间,而且这个地址空间里的值应该是某个地址,同时,指针本身也是一个变量。由于指针本身也是一个变量,那么它的默认初值、作用域、生存周期等都符合变量的特性。

指针在使用时一定要先初始化:

例如,int *p; 则编译器会分配一个4字节的内存用于存放p,但是此时p还未初始化,它的值是不确定的。我们可以用&p取出此指针的地址,用p表示该地址中的内容,但是,用*p引用该指针所指向的变量的值的结果是不可预知的。如果运气好,会崩掉,如果运气不好,就等着程序给你添麻烦吧。

一般来说指针的使用流程是:

int *p = NULL;   //定义并附初值0
int a = 0; p = &a;  //使用前赋值
cout<<*p<<endl;  //指针引用
p = NULL;       //不用时清空

1.3 NULL系列

在C语言中诸如NULL之类的用于帮助程序员理解程序的宏定义\说明有很多,现简要说明一下。

NUL:ASCII字符集中的’\0’字符的名字,它的字节模式为全0。事实上,根本就不存在预定义的符号NUL,如果想要使用,则必须自己定义。#define NUL 0 或 #define NUL '\0'
NULL:标识空指针。定义为0 即 #define NULL 0
false:标识逻辑0。定义为0 即 #define false 0
true:标识逻辑1。定义为1 即#define false 1

1.4 指针常见错误

指针最常见的错误就是段错误了。程序在执行时会分成许多段,对段的非法操作统称为段错误。比如,修改只读段的内容,比如访问不属于该程序的段。最为常见的例子就是访问不属于该程序的地址空间。

一种好的编程风格是在创建指针的时候赋初值NULL,因为一般而言任何操作系统都会把低位地址留给操作系统,把高位地址留给应用程序。当应用程序中引用地址0时会产生访问不属于该程序地址空间的操作,此时就会引发段错误。

对于某些要求对界的机器而言,当某种类型的数据在内存中的存储地址处在错误的边界上的时候,此时访问这个地址会引发一个总线错误。

注:本文中各种特例都是在UNIX系统的gcc编译器下调试的,本文所说的各种术语也都适用于UNIX系统,但是对于Windows未必适用。

问题:段错误的精确定义是什么?段错误和可执行程序的段到底有什么联系?

1.5 指针常量

我们可以将一个常量强制转换成指针,虽然这个操作并没有太多的意义,但确实是可以的。例如:

int * a = (int*) 100; 
*(int*)100 = 100;

问题:用常量在程序中表示的地址是不是绝对地址?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,420评论 3 44
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,764评论 0 27
  • C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一...
    xx_cc阅读 3,672评论 11 39
  • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*...
    冰吉凌阅读 3,303评论 0 18
  • 我生活在农村,一个家境不是很好的农民家庭。 父亲是个木匠,在农活闲下来的冬天,会去周边的四邻八乡的做点门窗家具之类...
    夏夜冬日阅读 163评论 2 1