`
alex09
  • 浏览: 969746 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C语言指针的初始化和赋值

阅读更多
最近写了一个小程序,遇到一点小问题,是关于指向字符串的指针的。由此一发不可收拾,好奇心驱使我决定研究一下指针的初始化和赋值规则。略有所得之后,执笔记下,以备后用。

1、指针的初始化

初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组。其实总结起来很简单:

int *p; 

int a=25; 

int b[10];

int *m=&a;

int *n=b;

int *r=&b[0];


指针的定义如上所示,以*打头的变量代表该变量为指针变量。

指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int *p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的意思。

int *s=15;

int *s={2,3,5};

int *s=a;


以上这三种初始化方式都是错误的。

2、指针的赋值

P=m;

P=&a;

P=b;

*p=25;

*p=a;

*p=b[4];


指针相关的赋值,“=”的左操作数可以是*p,也可以是p。

当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;当“=”的左操作数是p时,改变的是p所指向的地址。

数组的变量名b表示该数组的首地址,因此p=b;也是正确的。

3、“特殊情况”

前面讲到了,指针的初始化必须使用变量地址,而不可以直接使用变量。

那么,下面这个又如何解释呢:

Char *cp=”abcd”;

其实,这个初始化过程,是将指针cp指向字符串的首地址,而并不是传递字符串的值。因为,在C语言里面,没有整体处理一个字符串的机制。

所以,我们的标题“特殊情况”加上了一个引号,因为,它实际上也是以变量地址初始化的指针,“特殊情况”并不特殊。

由此引出,如何使用字符串对指针赋值呢?只有采用下面这种方式:

Cp=”mnop”;

型如*cp=”mnop”;这样的语句是错误的。原因如上所述,字符串常量传递的是它的首地址。

另外,这个初始化过程还有另一层隐含的意思:”abcd”是字符串常量,在初始化过程中并没有发生字符串的复制,而只是简单的将指针指向该字符串常量,因此,不可以通过*cp修改该字符串的值,因为该字符串为常量。当然,我们可以使用“cp=”来修改指针指向的字符串,指针本身并不是常量。

如果试图通过指针*cp来修改该字符串,会出现什么结果,答案是未定义的,要视不同的编译器而定。至少有一点可以确定,在编译阶段,编译器不会报错,因为*cp不是常量,所以对*cp赋值并没有什么语法错误。但是有些编译器,比如VC,会在运行时抛出异常:写入位置 0x00415768(cp指向的地址) 时发生访问冲突!

这点上与char ca[]=”abcd”;是不同的,通过ca[x]可以修改字符串中的数据。

4、   C语言的经典著作

最后,顺便提一下C语言的经典好书。主要有下面几本:

《The C Programming Language》(C程序设计语言),C语言之父所著,短短二百多页就可以把C语言的各种细节描绘得清清楚楚,不可不谓经典。比起国内四五百页,却不知其所云的C语言程序设计来,真是天壤之别。

《C专家编程》,该书第一版于2002年由人民邮电出版社引进,之后曾一度绝版。最近传出要再版的消息,令人不能不兴奋。同时,这本书也是我近期想要收藏的。

另外,还有两本著作不可不提:《C和指针》、《C陷阱与缺陷》。这两本书也是绝版多年,而且书中很多内容是针对于未标准化前的C提出的。如果能找来电子书的话,作为参考也是不错的。
分享到:
评论
1 楼 genier200 2011-08-23  
看帖必回:

谢谢分享,楼主可否再写一篇关于数组、指针之间关系的文章。

相关推荐

    C语言程序设计-指针与函数.pptx

    用函数名为指针初始化,表示指针指向该函数。 int(*pf)(); /*定义函数型指针*/ int f(); /*声明函数f */ pf=f; /*指针pf 指向函数f */ 4-2 函数型指针的赋值 当函数型指针指向了某一函数后,函数的调用可以用函数名...

    C语言全套视频教程 视频.txt

    55) C语言之结构体的定义和初始化 56) C语言之访问结构体成员 57) C语言之结构数组 58) C语言之结构体指针 59) C语言之结构体做函数参数 60) C语言之把结构体保存到文件 已更新至此 61)C语言之联合简介 62)C语言之...

    C语言程序设计-指针与字符串.pptx

    用字符串常量为字符指针初始化,其形式与字符数组的初始化类似,却有本质上的区别:字符数组获得字符串所有的字符,而字符指针获得字符串首地址,与字符串内的字符无关。 【例8.4】用指向字符串的指针变量完成两个...

    自学去c语言视频教程

    55) C语言之结构体的定义和初始化 56) C语言之访问结构体成员 57) C语言之结构数组 58) C语言之结构体指针 59) C语言之结构体做函数参数 60) C语言之把结构体保存到文件 61) C语言之联合简介 62) C语言之枚举类型 63...

    C语言程序设计(PDF格式)

    7.1.3 结构体类型变量的初始化 127 7.2 结构体数组的定义和引用 129 7.3 结构体指针的定义和引用 135 7.3.1 指向结构体类型变量的使用 135 7.3.2 指向结构体类型数组的指针的 使用 136 7.4 链表的建立、插入和删除 ...

    谭浩强c语言程序设计

    11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 ...

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    字符数组的初始化赋值 269 空字符串 270 字符串的读取 270 格式化显示字符串 271 9-2 字符串数组 273 字符串数组 273 读取字符串数组中的字符串 274 9-3 字符串处理 275 字符串长度 275 显示字符串 277 ...

    C语言程序设计(高清PDF)

    7.1.3 结构体类型变量的初始化 127 7.2 结构体数组的定义和引用 129 7.3 结构体指针的定义和引用 135 7.3.1 指向结构体类型变量的使用 135 7.3.2 指向结构体类型数组的指针的 使用 136 7.4 链表的建立、插入和删除 ...

    谭浩强C语言设计第三版.pdf

     7.1.2 定义结构体类型变量及对变量的初始化  7.1.3 结构体变量的操作  7.1.4 嵌套结构体类型  7.1.5 位段  7.2 结构体数组  7.2.1 结构体数组的定义与初始化  7.2.2 对结构体数组元素的操作  7.3 指向...

    谭浩强 C语言程序设计 教程全书 Word版

    11.10.2 枚举类型变量的赋值和使用 15 11.11 类型定义符typedef 16 12 位运算 1 12.1 位运算符C语言提供了六种位运算符: 1 12.1.1 按位与运算 1 12.1.2 按位或运算 2 12.1.3 按位异或运算 2 12.1.4 求反运算 3 ...

    谭浩强版c语言程序设计

    11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 ...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

    《C语言程序设计》-PDF格式

    7.1.3 结构体类型变量的初始化 127 7.2 结构体数组的定义和引用 129 7.3 结构体指针的定义和引用 135 7.3.1 指向结构体类型变量的使用 135 7.3.2 指向结构体类型数组的指针的 使用 136 7.4 链表的建立、插入和删除 ...

    程序设计语言 (C语言)(常用函数说明)

    四 变量的初始化和赋值 15 第五章 运算符 22 一 算术运算符 22 二 关系运算符和逻辑运算符 24 三 Turbo C运算符的优先级 28 第六章 输入输出函数及控制流程语句 29 一 标准输入输出函数 29 二 文件的输入输出函数 37...

    《C语言程序设计》谭浩强

    11.10.2 枚举类型变量的赋值和使用 185 11.11 类型定义符typedef 12 位运算 12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 ...

    C语言讲义.doc

    4.1.1 定义结构体struct和初始化 71 4.1.2 访问结构体成员 71 4.1.3 结构体的内存对齐模式 72 4.1.4 指定结构体元素的位字段 72 4.1.5 结构数组 72 4.1.6 嵌套结构 73 4.1.7 结构体的赋值 73 4.1.8 指向结构体的指针...

    C语言大纲及课件

    数组的特性,数组的定义和初始化的含义及数据的引用方法。  了解:应用数组知识编制简单事物处理系统的应用程序。 ⑺ 函数  掌握:函数的定义和函数调用的方法;函数调用的形式参数与实际参数的对应关系;函数...

    C语言全书word版CHAR11

    11.5 结构变量的初始化 5 11.6 结构数组的定义 5 11.7 结构指针变量的说明和使用 7 11.7.1 指向结构变量的指针 7 11.7.2 指向结构数组的指针 9 11.7.3 结构指针变量作函数参数 10 11.8 动态存储分配 11 11.9 链表的...

    C语言编程兵书(完整扫描版 )pdf格式 电子书

    2.2.3 变量的出生和成长—初始化和赋值 2.2.4 变量的寿命—作用域 2.2.5 使用extern声明变量 2.3 C语言的细胞数据类型 2.3.1 整型(int) 2.3.2 实型(float) 2.3.3 字符型(char) 2.4 运算符和表达式 2.4.1 ...

Global site tag (gtag.js) - Google Analytics