C指针声明

声明C指针

通过在数据类型后面跟星号,再加上指针变量的名字可以声明指针。下面的例子声明了一个整数和一个整数指针:

int num;
int *pi;

星号两边的空白符无关紧要,下面的声明都是等价的:

int* pi;
int * pi;
int *pi;
int*pi;

空白符的使用是个人喜好。

星号将变量声明为指针。这是一个重载过的符号,因为它也用在乘法和解引指针上。

对于以上声明,下图说明了典型的内存分配是什么样的。三个方框表示三个内存单元,每个方框左边的数字是地址,地址旁边的名字是持有这个地址的变量,这里的地址100只是为了说明原理。就这个问题来说,指针或者其他变量的实际地址通常是未知的,而且在大部分的应用程序中,这个值也没什么用。三个点表示未初始化的内存。

内存图解

指向未初始化的内存的指针可能会产生问题。如果将这种指针解引,指针的内容可能并不是一个合法的地址,就算是合法地址,那个地址也可能没有包含合法的数据。程序没有权限访问不合法地址,否则在大部分平台上会造成程序终止,这是很严重的,会造成一系列问题。

变量numpi分别位于地址100和104。假设这两个变量都占据4字节空间,就像1.2节中所说,实际的长度取决于系统配置。除非特别指明,我们所有的例子都使用4字节长的整数。

记住这几点:

  • pi的内容最终应该赋值为一个整数变量的地址;
  • 这些变量没有被初始化,所以包含的是垃圾数据;
  • 指针的实现中没有内部信息表明自己指向的是什么类型的数据或者内容是否合法;
  • 不过,指针有类型,而且如果没有正确使用,编译器会频繁抱怨。

尽管不经过初始化就可以使用指针,但只有初始化后,指针才会正常工作。

如何阅读C指针的声明

现在介绍一种阅读指针声明的方法,这个方法会让指针更容易理解,那就是:倒过来读。尽管我们还没讲到指向常量的指针,但可以先看看它的声明:

const int *pci;

倒过来读可以让我们一点点理解这个声明

倒过来的声明

很多程序员都发现倒过来读声明就没那么复杂了。

遇到复杂的指针表达式时,画一张图,我们在很多例子中就是这样做的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程