(三)C语言数据类型

您所在的位置:网站首页 c语言内存地址称为 (三)C语言数据类型

(三)C语言数据类型

2023-09-15 17:15| 来源: 网络整理| 查看: 265

(三)C语言数据类型——指针类型 指针是C语言的特色之一,熟练掌握和正确使用指针对一个成功的C语言程序设计人员来说是十分重要的。正确灵活地运用指针,可以使程序编写简洁、紧凑、高效。利用指针变量可以有效地表示各种复杂的数据结构,如队列、栈、链表、树、图等。 一.指针的概念

1.变量的地址与变量的内容 在计算机中,所有的数据都是以二进制形式存放在内存储器中。一般把内存中的一个字节成为一个内存单元,不同的数据类型所占用的内存单元数不等。为了正确地访问这些内存单元,必须为每个内存单元编号。根据一个内存单元的编号即可准确地找到该内存单元所在位置,内存单元的编号叫做内存地址。

C语言中的每个变量在内存中都要占有一定字节数的存储单元,C编译系统在对程序编译时会自动根据程序中定义的变量类型在内存中为其分配相应字节数的存储空间,用来存放变量的数值。变量在内存单元中存放的数据,成为变量的内容,而把存放该数据所占的存储单元位置(即内存地址),称为变量的地址。

例如:当编译系统读到说明语句**“short a=9;”**时则给变量a分配两个字节(即两个存储单元)的内存空间; **“double c;”**只是为变量c定义了双精度实数类型,没有给变量赋予处置,编译系统仅为该变量分配了对应的8个字节的内存空间,等待在程序运行过程中随机存放数据。

2.直接访问(寻址)与间接访问(寻址)

程序中欲对变量进行操作时,可以直接通过变量地址对其存储单元进行存取操作,把这种按变量地址存取变量的方式成为“直接访问(寻址)”方式。通常情况下,只需要使用变量名就可以直接引用该变量在存储单元中的内容。

例如,编译程序为变量a分配了地址从0x6000到0x6001的两个字节存储单元并赋予初值9,变量名a的存储单元首地址是0x6000;那么a就代表变量的内容9。

如果变量a的内存地址存放在另一个变量p中,为了访问变量a,就必须通过先访问变量p获得变量a的首地址0x6000后,即经过变量p"中介",再到相应的地址中去访问变量a并得到a的值。把这种间接地得到变量a的值的方法称为“间接访问(寻址)”方式。

这个专门用来存放内存地址数据的中介变量p,就是下面要介绍的指针类型变量,简称为指针变量 。

3.指针和指针变量 通过对内存单元“间接访问”的概念可知,通过存储单元地址可以找到所需要的变量单元,即该地址“指向”某个变量所在的内存单元。因此在C语言中,将一个变量的地址形象地称为该变量的“指针”,如上例中的变量p就是内存变量a的指针变量。

“指针”是一个地址,变量的指针就是变量的地址。存放指向地址的变量叫做“指针变量”。“指针”和“指针变量”实际上是两个不同的概念。存放变量a的内容的存储单元首地址0x6000是变量a的“指针”,而存放变量a"指针"的变量p才叫“指针变量”。

4.指针变量的数据类型 指针变量是用来存放存储单元地址的,所以指针变量的数据类型并不代表指针变量本身的数据类型,而是它所指向的目标变量的数据类型。因此,目标变量的数据类型决定了指针变量的数据类型。

由于各种类型的数据在内存单元中占据的空间是不同的,所以指针变量只能是指向某个变量的存储单元的首地址,而不能随便指向该空间的其他地址。

一个指针变量+1运算后,会一次性跳过所指向的目标变量的类型所占用的全部单元,这个“步长”根据数据类型是可变的。

5.使用指针变量应注意的原则 (1)指针变量使用前必须明确其指向,否则会带来歧义; (2)一个类型的指针变量只能用来指向同一数据类型的目标变量,而且必须指向目标变量所在存储单元空间的首地址; (3)指针变量指向数组元素时,要注意防止数组下标出界; (4)分析程序时要特别注意指针变量当前的值,尤其是指针变量运算后当前的值。 二.指针变量的定义 指针变量定义的一般形式为:

*[类型修饰符] 数据类型 变量名列表

例如: int i,j; int *p1,*p2; 定义了两个整型变量i、j和两个指向整型变量的指针变量p1、p2。 可以分别使每个指针变量指向一个整型变量,如: p1=&i ; p2=&j ; 指针变量名遵循标识符的命名规则。

说明: (1)变量名前的号代表该变量是指针变量,以上定义的p1和p2是指针变量,而不是说p1和*p2是指针变量。 (2)指针变量的类型绝不是指针变量本身的类型,不管是整型、实型,还是字符型变量,它们都是用来存放地址的,所以指针变量就其本身来说没有类型之分,这里所说的类型是指它指向的目标变量的数据类型。一个类型的指针变量只能用来指向统一数据类型的目标变量,例如一个整型的指针变量只能指向整型变量而不能指向其他类型的变量。就是说,只有同一类型变量的地址才能存放到指向该类型变量的指针变量中。 例如: int *p; char *str; float *q; 其中,p是指向整型数据的变量;str是指向字符型数据的指针变量;q是指向实型数据的指针变量。 (3)同一存储属性和统一数据类型的变量变量、数组、指针等可以在一行中定义。

2.指针变量的初始化 给指针变量赋予初值的过程称为指针变量的初始化。指针变量在定义的同时也可以进行初始化。 例如: int *p=&a; 说明: (1)“ * ”只表示其后面跟的标识符是个指针变量。“ & ”表示取地址符。取出变量的地址给指针变量赋值。 (2)把一个变量的地址作为初始值赋予指针变量时。该变量必须在此之前已经被定义过,因为变量只有在定义后才被分配存储单元。 (3)指针变量定义时的数据类型必须和它所指向的目标变量的数据类型一致。 (4)可以用初始化了的指针变量给另一个指针变量进行初始化赋值。例如: int x; int *p=&x; int *q=p; /用已经赋值的指针变量p给另一个指针变量q赋值 (5)不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针。例如: int *p=6000; /非法 int *p=0; /合法。代表将p初始化为空指针,“0”代表NULL的ASCII字符

3.指针变量的引用 关于指针变量的引用,通过上述已经出现的两个相关运算符进行说明。 (1)*:称为指针运算符或称为“间接访问内存地址”运算符;在定义时,通过它表明某个变量被定义为指针变量,而在使用时,*p则表示p所指向的变量的内容。 (2)&:称为取地址运算符,通过它获得目标变量所在存储单元的地址。

例:

#include void main() { int a,b; int *pointer_1;*pointer_2; a=100; b=10; pointer_1=&a; /*把变量a的地址赋给指针变量pointer_1 pointer_2=&b; /*把变量b的地址赋给指针变量pointer_2 printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1,*pointer_2); /*表示地址pointer_1和pointer_2所指向变量的内容 }

该程序运行结果为:

100,10 100,10


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3