跳到主要内容

数组和指针

数组

数组名的意义

  1. 数组名的本质是一个文字常量,代表数组第一个元素的地址和数组的首地址。 数组名本身不是一个变量,不可以寻址,且不允许为数组名赋值。

  2. 在 sizeof()运算中,数组名代表的是全体数组元素,而不是某个元素。

数组的初始化

  1. 初始化项的长度不允许超过数组的长度
  2. 不允许中间跳过某项
  3. 某些编译器允许动态定义数组的大小。比如icpc,gcc(darwin)。

数组特性

针对下面这道练习题,我发现这里答案与预期有所出入。

#include <stdio.h>

size_t func(int arr[])
{
return sizeof(arr);
}

int main(void)
{
int arr[100];
size_t size = func(arr);
printf("%d",size == sizeof(arr));
return 0;
}

/*
以上程序的输出是:
A 1
B 0
C 2
D 3
*/

根据常理来说,这里的表达式 size == sizeof(arr) 的返回值应该是相同的,都应该等于400,但是这里显然并不是这样。于是我添加了断点进行调试:debug_1

很奇怪对吧。函数的返回值为8,但数组的大小确实为400。那么究竟发生了什么呢?我注意到有一行警告

debug_2

这里返回的大小是指针的大小???这么神奇吗?于是我去查了一下资料。原来数组名作形参时,会退化为指针。所以这里也就能解释通了。我是64位darwin内核的系统,所以指针的大小为8。

指针

定义

指针式用来存放地址值的变量。相应的数据类型称之为指针类型。

指针可用的运算

  1. 解引用运算: 获取指针所指的内存地址处的数据。表达式是 * p
  2. 取地址运算: 获取指针变量的地址。表达式是 &p。
  3. 指针与整数相加减:如p+1,实际上就是让指针递增或递减地移动1个int型变量的距离。
  4. 两个指针相加减: 其结果是两个指针存储的地址间的int型数据的个数。

指针有效性

在使用中需要保证指针指向的位置是有效的。如果不知道指针该指向何处,则应该置为空指针NULL,或者((void *)0)