1.指针实际上是变量地址的抽象

2.指针数组

int* a[] = {&x, &y, &z}; a成为一个指针数组,数组里的每一个元素均为指针

3.数组指针

int a[4] = {1, 2, 3, 4};

int* p = a;成为一个指向数组a首地址的指针
数组名a本身也是一个指向数组首地址的指针

p+1指向数组中第二个元素
*(p+1)取出数组中第二个元素

int (*a)[4]; 声明了一个名为a的指针,这个指针指向长度为4的int数组.这种写法是个函数指针一样的

4.多维数组与指针

int a[3][4]
a[0]指向a[0][0]这个元素
a[1]指向a[1][0]这个元素
a[2]指向a[2][0]这个元素

a是数组名,a也表示数组的首地址,这里有个特殊的地方是 a=&a=*a,对数组名取地址和取内容得到的值是一样的都是地址值
a+1和a[1]是一样的也就是直接跨过一行

(a+i)是第二行首地址,但第二行也是一个数组的首地址故a+i=&(a+i)=*(a+i)都是地址值

所以取第i行第j列的值就是*(*(a+i)+j)

//传递二维数组的方法
int m[3][4]; //m的类型是 int (*a)[4]
所以传递参数类型也是 int (*a)[4]
但是注意此时行列信息丢失了,不能用sizeof(a)/sizeof(a[0])求行数了

5.函数指针

int (*comp)(void*, void*); 声明了一个名为comp的函数指针,这个函数接受两个参数,返回int

typedef int (*comp)(void*, void*) 定义了一个名为comp的函数指针类型

6.复杂声明

复杂声明需要,由外向里逐个确定表达式的值即可

char (*(*x())[])()是一个函数,函数返回一个指针,指针指向一个数组,每个元素是一个指针,指向返回值为char的函数
(*(*x())[])() 是一个char
(*(*x())[]) 是一个返回值为char的函数
(*x())[] 是一个指针,指向返回值为char的函数
(*x()) 是一个数组,每个元素是一个指针,指向返回值为char的函数
x() 是一个指针指向一个数组,每个元素是一个指针,指向返回值为char的函数
x 是一个函数,函数返回一个指针,指针指向一个数组,每个元素是一个指针,指向返回值为char的函数

char (*(*x[3])())[5]; x是一个长度为3的数组,数组里每个元素是一个函数指针,每个函数指针指向一个返回值为char[5]的函数.
*(*x[3])() 是一个5个char元素的数组
*(*x[3]) 是一个函数,返回值是指针,指向5个char元素的数组
*x[3] 是指针,每个指针指向一个函数,返回值是指针,指向5个char元素的数组
x[3] 是数组,数组每个元素是指针,每个指针指向一个函数,返回值是指针,指向5个char元素的数组

results matching ""

    No results matching ""