C语言的数据类型——指针
Posted 一只学习的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言的数据类型——指针相关的知识,希望对你有一定的参考价值。
文章目录
1 前言
指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。
2 地址指针的概念
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占 2 个单元,字符量占 1 个单元等。
为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针 。
严格地说,一个指针是一个地址,是一个常量。
3 变量的指针和指向变量的指针变量
变量的指针就是变量的地址。存放变量地址的变量是指针变量。
3.1 定义一个指针变量
对指针变量的定义包括三个内容:
(1) 指针类型说明,即定义变量为一个指针变量;
(2) 指针变量名;
(3) 变量值(指针)所指向的变量的数据类型。
其一般形式为:
类型说明符 *变量名;
其中, *表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
3.2 指针变量的引用
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。**未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误。**在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。
两个指针有关的运算符:
1)&:取地址运算符;
2):指针运算符;
C语言中提供了地址运算符来表示变量的地址,需要注意的时指针运算符和指针变量说明中的指针说明赋不是一回事。再指针变量说明中,是类型说明符,表示其后的变量是指针类型。而表达式中出现则表示一个运算符,表示指针变量所指的变量。
其一般形式为:
&变量名;
给指针赋值的两种方式:
(1) 指针变量初始化的方法
int a;
int *p=&a;
(2) 赋值语句的方法
int a;
int *p;
p=&a;
3.3 指针变量作为函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
4 数组指针和指向数组的指针变量
一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
数组指针变量说明的一般形式为:
类型说明符 *指针变量名;
4.1 通过指针引用数组元素
根据以上叙述,引用一个数组元素可以用:
- 下标法,即用 a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
- 指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中 a 是数组名, p 是指向数组的指针变量,其初值 p=a。
4.2 指向多维数组的指针和指针变量
从二维数组a[3][4]的角度来看:
1) a 是二维数组名, a 代表整个二维数组的首地址,也是二维数组 0 行的首地址。 a+1 代表第一行的首地址。
2)C语言允许把一个二维数组分解为多个一维数组来处理。因此数组 a 可分解为三个一维数组,即 a[0], a[1], a[2]。每一个一维数组又含有四个元素。比如a[0]是第一个一维数组的数组名和首地址。
4.3 数组指针
二维数组指针变量说明的一般形式为:
类型说明符 (*指针变量名)[长度]
如:
int (*p)[4];
它表示 p 是一个指针变量,它指向包含 4 个元素的一维数组。
5 函数指针变量
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
之后就可以用指针形式实现对函数的调用了。
*调用函数的一般形式为:
(指针变量名) (实参表)
注意和返回指针变量的函数区分:
类型说明符 *函数名(形参表)
…… /函数体/
6 指针数组
一个数组的元素值为指针则是指针数组。
指针数组说明的一般形式为:
类型说明符 *数组名[数组长度];
6 void指针类型
ANSI 新标准增加了一种“ void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据。
以上是关于C语言的数据类型——指针的主要内容,如果未能解决你的问题,请参考以下文章