指针&数组、指针&函数

指针和数组

区别

int a[5]; //会创建5个 int 空间
int *b; //只会创建一个 int * 空间

*a, *b ; //前者合法,后者不合法
b++ , a++ ; //前者合法,后者不合法

比较

在没有对数组进行优化的编译器上,指针 效率 >= 数组下标的方式

int array[10], a;
for (a = 0; a < 10; a += 1){
  # 此处需要运行时每次都用a乘以4(因为这里是int)
  array[a] = 0;
}

# 而这个方法中,ap ++ 时需要 1乘以4,但是是编译时执行,运行时只是加4
int *ap;
for(ap = array; ap < array + 10; ap ++){
  *ap = 0;
}

只有两个指针都指向同一个数组元素的时候,才允许从一个指针减去另一个指针,结果是下标的差值,是一种有符号整数类型ptrdiff_t

指针数组

int *api[10];

首先明确,这是一个定义声明 根据操作符优先级 [] > 我们先读取了 api[10] 的定义,这表示一个数组 然后我们读取了 int 的定义,这表示整形指针类型

类似常规数组 int a[10]; 常规指针 int *a; 所以这是一个 长度为10的 包含整形指针的 数组

数组指针

int matrix[3][10];  
int (*p)[10] = matrix;

我们先读取了 *p, 这表示一个指针

函数和指针

# &是可选的,编译器会默认处理  
int (*pf)(int) = &f;

# 使用
int result;
result = f(25);
result = (*pf)(25);
result = pf(25);

指针、函数、数组

这一块会比较混乱,可以尝试使用unix系统,获取cdecl程序,可以解释一个声明。。

cdecl> explain int (*(*f)())[10];

源码在comp.sources.unix.newsgroup

Last updated

Was this helpful?