C语言:指针1:指针的声明以及复杂声明语法(一个C语言小白的理解之旅) – 源码巴士

您所在的位置:网站首页 对node的理解 C语言:指针1:指针的声明以及复杂声明语法(一个C语言小白的理解之旅) – 源码巴士

C语言:指针1:指针的声明以及复杂声明语法(一个C语言小白的理解之旅) – 源码巴士

2023-03-13 11:26| 来源: 网络整理| 查看: 265

一. 什么是指针?如何定义指针?

指针是一个变量,其值为另一个变量的地址(内存位置的直接地址)。就像其他变量或常量一样,我们必须在使用指针存储其他变量地址之前,对其进行声明。 定义指针的一般类型为:

,,…;

需要注意的是: 对于32位操作系统,内存地址大小是4个字节,指针变量的大小也需要4 个字节。 对于64位操作系统,内存地址大小是8个字节,指针变量的大小也需要8个字节。

二. 如何对指针变量进行声明?

1.声明简单的指针变量

int i = 1; int *p; //声明一个指向int类型数据的指针变量 p p = &i; //&为取地址符,把变量i的地址赋值给指针 p *p = 2; //此时 i 的值变成2了

这段代码声明了一个指针变量p,并把它指向变量i,通过 * p 可以访问到变量 i,并对 i 的值进行修改。现在对星号 * 的作用进行详细的讲解。* 是一元运算符,它用在不同的地方将具有不同的作用。

1.1 星号 * 用于声明语句时的作用

上面的代码片段中的第2行代码“int *p;”就是星号 * 用于声明语句时的情况。对于指针的声明,我们首先要从 p 这里开始看起,这是C语言中“声明”的语法,下面会介绍到。 第一步:先看p的右边有没有其它符号(分号不算),可以看到p的右边并没有符号。 第二步:看p的左边,在p的左边有一个星号 * ,关键的时候到了!在这里可以看到星号 * 作用于p上 面,其产生的效果是“声明变量 p 是一个指针 ”。目前为止,我们已经知道 p 是一个指针了,但还不知道该指针是指向什么类型数据的。 第三步:看星号 * 右边的类型说明符 int,在这里int的作用就是声明 p 指向的数据类型是int。至此,“int p;”这句代码就完全解释完了。 注意!上面的 int 、 这两个符号发挥作用是有先后的,并不是组合在一起来发挥作用的。先是 * 发挥作用:声明p是一个指针变量。然后是int发挥作用:声明p指向的数据类型是整型数据。

1.2 星号 * 用于声明语句之外时作用

上述代码片段中,最后一句“ *p = 2; ”就是星号 * 用于声明语句之外时的作用。这句语句等效于“ i =2;”。即p获取了i的地址后,*p则可看作时获取了该内存地址的存储对象,称之为“解引用“或“间接引用”。 用专业点的说法就是:如果指针p指向整形变量 i,那么在 i 出现的任何上下文中都可以使用 *p ,当 *作用于指针变量p时,就是访问指针变量p所指向的变量 i。

2.声明复杂的指针变量

要了解指针变量,或多或少会出现一些比较复杂的类型,所以先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以,我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析。下面让我们先从简单的类型开始慢慢分析吧!

int p;

这是一个普通的整型变量。

int *p;

首先从P处开始,先与 * 结合,所以说明P是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型,所以P是一个返回整型数据的指针。

int p[3];

首先从P 处开始,先与[ ]结合,因为其优先级比 * 高,所以P 是一个数组,然后再与 * 结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组。

int(*p)[3];

首先从P 处开始,先与 * 结合,说明P 是一个指针,然后再与[ ]结合,与"( )"这步是为了改变优先级,说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的,所以P 是一个指向由整型数据组成的数组的指针。

int **p;

首先从P开始,先与结合,说是P 是一个指针,然后再与结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据。注:由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针。

int p(int);

从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据。

int (*p)(int);

从P处开始,先与指针结合,说明P是一个指针,然后与( )结合,说明指针指向的是一个函数,然后再与( )里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针。

int *(*p(int))[3];

从P开始,先与( )结合,说明P 是一个函数,然后进入( )里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的 * 结合,说明函数返回的是一个指针,然后到最外面一层,先与[ ]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据,所以P 是一个参数为一个整数数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。

总结&a表示a变量的地址,scanf("%d",&a)中&a就是将输入的值存入a变量的地址中。*ip定义一个指针变量ip,ip代表指针变量,赋值内容为地址(即指向变量的地址)*ip表示值是地址的变量,访问的是ip地址内容在数组中指针变量仅仅代表数组的首地址,数组名就数组的首地址


【本文地址】


今日新闻


推荐新闻


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