例如,有如下所示的C语句序列:则结构体指针变量p1指向结构体数组元素a[2],其关系如图10.2所示。此时应该注意到被指针变量p1指向的结构体数组元素本身是不能作为整体操作的,所以*p1也不能作为整体操作。......
2023-11-20
C语言通过定义字符型指针变量,并将字符串或字符串常量的首地址赋给该指针,即可用指向字符串的指针变量来表示其所指向的字符串数据,其定义格式有两种:
·用字符串数据初始化指针变量,其一般格式为:
char*字符指针变量名=字符串常量;
例如:char*sPtr="I Love China!";
·先定义字符指针变量,然后指向特定字符串常量,其一般形式为:
char*sPtr;
sPtr="I Love China!";
无论使用哪种形式,在此后的程序代码中,都可以使用字符指针变量sPtr表示字符串数据"I Love China!"。
当定义一个字符指针变量表示字符串时,如语句char*sPtr="abcd";,其本质上的意义是首先在存储器中存放一个字符串常量,然后将字符串常量的首地址赋给字符指针变量sPtr,字符指针变量与其所指向的字符串常量之间的关系如图8.12所示。由于sPtr是变量,所以在此后的程序代码中任何修改其指向的操作都是合法的,例如,使用语句sPtr="1234"使得指针变量sPtr改变指向从表示字符串数据"abcd"转变成为表示字符串数据"1234",sPtr与其所指向的字符串常量之间的关系如图8.13所示。
图8.12 指针变量指向字符串常量
图8.13 指针变量改变原指向指向另一字符串
而使用字符数组表示字符串时,例如,语句char str[7]="abcd";,其本质意义是首先为字符数组str按指定长度分配连续的存储空间,字符数组的名字str表示这段连续存储空间的首地址,然后将其存储内容初始化为字符串数据"abcd",字符数组str与其初始值之间的关系如图8.14所示。
图8.14 数组名与其初始化值之间的对应关系
由于字符数组名str是地址常量,数组亦不能作为整体操作,所以在此后的程序代码中任何试图修改数组名str值的操作或者试图为数组整体赋值的操作都是错误的。请仔细比较下面的两段代码段:
此外,在选择使用字符指针方式还是选择字符数组来表示字符串数据时还应注意:使用字符数组方式时,字符串数据是字符数组中存放的内容(可以认为是数组变量的值),只要有需要均可以通过合法的语句对数组中的内容进行修改;而使用字符指针变量来表示字符串数据时,字符串数据是常量,任何试图修改常量数据的操作都是非法的,亦即字符指针指向的常量字符串内容是不能被修改的。
使用字符指针变量表示字符串数据时,最容易出现的错误就是将未确定指向的字符串指针变量直接使用。未确定指向的意思是:指针变量既没有指向特定的字符数组,也没有指向动态分配的空间。例如,下面的代码段是错误的:(www.chuimin.cn)
char*st;
gets(st); //错误:st是一个没有确定指向的字符指针变量
如果定义了字符数组,一个指向它的指针变量相当于是字符数组的另外一个名字。此时,无论是字符数组本身还是指向它的指针变量都可以用于处理字符串。如果仅定义了一个字符指针变量,那么必须使用该指针变量构成动态字符数组后才能用于处理字符串。
【例8.19】 使用指向字符数组的指针变量处理字符串示例。
上面程序中,指针变量s2在进行存储分配后形成了动态字符数组,使用动态字符数组表示了被处理的字符串。程序一次执行的结果如下:
请输入字符串s1和s2
ABCDEFG //输入数据
1234567//输入数据
1234567ABCDEFG//输出数据
有关C语言程序设计基础(第3版)的文章
例如,有如下所示的C语句序列:则结构体指针变量p1指向结构体数组元素a[2],其关系如图10.2所示。此时应该注意到被指针变量p1指向的结构体数组元素本身是不能作为整体操作的,所以*p1也不能作为整体操作。......
2023-11-20
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2023-11-18
图8.1函数内存映射方式1.指向函数指针变量的定义C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。指向函数的指针变量求最大值、最小值和两数之和。......
2023-11-20
针对不同的实际应用,数据排序方法有很多种。本节介绍两种常用排序方法的基本思想和实现方法,帮助读者初步理解排序方法的计算机解决思路。②不考虑已排好序的数据,将剩下的数据作为待排序列。编写程序实现冒泡排序算法,对随机生成的10个3位整数按升序进行排序并输出。......
2023-11-20
当一个指针指向一个结构体变量时,称为结构体指针变量。结构体指针变量中的值是所指向的结构变量的首地址,通过结构指针即可访问该结构变量。结构体指针变量定义的一般形式为:struct结构类型名 *结构指针变量名在定义了struct student结构类型后,如要定义一个指向该结构类型的指针变量pstu,可写为:struct student*pstu;当然也可在定义struct student结构类型的同时定义pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后使用。......
2023-11-18
当指针变量指向一维数组的首元素时,称为指向了一维数组。所以,函数中一维数组形式参数可以用同类的指针形式参数替代;同理也可以用指向特定数组的指针变量来传递数组类实际参数。特别需要注意的是,函数的形式参数无论使用的是数组名形式还是指针变量形式,本质上都是一个指针变量,在被调函数中既可以将它当作数组名使用也可以将它当作指针变量使用。......
2023-11-20
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
相关推荐