C指针声明

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

int num;
int *pi;

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

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

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

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

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

enter image description here

图1-2:内存图解

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

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

注意 本书用100这样的地址来解释指针如何工作,这样会简化例子。当你运行示例代码时会得到不同的地址,而且这些地址甚至在同一个程序运行几次的时候都可能变化。

记住这几点:

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

注意 说到垃圾,我们是指分配的内存中可能包含任何数据。当内存刚分配时不会被清理,之前的内容可能是任何东西。如果之前的内容是一个浮点数,那把它当成一个整数就没什么用。就算确实包含了整数,也不大可能是正确的整数。所以我们说内容是垃圾。

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

赞(3)

评论 抢沙发

评论前必须登录!

 

C指针