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 通过指针引用数组元素

根据以上叙述,引用一个数组元素可以用:

  1. 下标法,即用 a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
  2. 指针法,即采用*(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语言的数据类型——指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

如何封装C语言的字符串相关功能

C语言 如何给指针数组划分动态存储空间

结构数据类型实验

c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?