指针数组
指针数组就是一个数组,这个数组里面的元素是指针。
一般形式为: 类型标识符 * 数组名[数组长度]
比如
int *array[10];
上例中,[ ] 优先级高,与左边的array合并成为数组,array是数组名,int *说明这个数组是一个整型指针数组,这个数组里面的所有元素都是指向整型的指针。
数组指针
数组指针又称行指针,是一个指针,这个指针指向一个数组的首地址。
一般形式为:类型标识符 (*指针变量名)[数组长度]
int (*p)[10];
上例中, ( ) 优先级高,则变量p是一个指针,这个指针指向一个长度为10的一位数组的首地址。
指向二维数组的指针的几种表达方式
定义一个整型二维数组a[3][4]
表现形式 | 含义 | 地址值 |
---|---|---|
&a | 指向二维数组的指针 | 0x1000 |
a | 数组名,0行首地址 | 0x1000 |
a[0], *(a+0), *a | 第0行第0列地址 | 0x1000 |
a+1, &a[1] | 第1行首地址 | 0x1006 |
a[1], *(a+1) | 第1行第0列地址 | 0x1006 |
a[1]+2, *(a+1)+2, &a[1][2] | 第1行第2列地址 | 0x1010 |
*(a[1]+2), *(*(a+1)+2), a[1][2] | 第1行第2列值 | 数组值11 |
&a[i] 并不是 a[i] 的物理地址,在内存中 &a[i]并不存在, &a[1] 只是一个地址计算方法, 但C语言允许这样的操作。
a+i = a[i] = *(a+i) = &a[i] = &a[i][0] 它们的地址值相等
指针函数
指针函数,它是一个函数,它的函数类型是指针,即这个函数的返回值是一个指针。
声明格式为:类型标识符 * 函数名( 参量表 )
比如
char * fun(int x,int y)
上例中,( ) 优先级高,与fun合并成为函数,fun是函数名,char * 说明这个函数的返回值是一个字符型的指针,是一个地址。
函数指针
函数名是一个函数的首地址(入口地址),把这个首地址赋予给一个指针变量,使该指针指向该函数。然后通过指针变量就可以找到并调用这个函数。这个指向函数的指针变量就被成为函数指针变量。
声明格式为:类型说明符 (*指针变量名)(参数)
void print()
{
printf("helloworld\n");
}
int add(int x, int y)
{
return x + y;
}
int main()
{
void (*p)();
int (*q)(int, int);
p = print;
q = add;
p();
printf("%d\n", q(1, 2));
}
上例中,变量 p和q都是函数指针 。变量p是一个无参量返回值为void类型的指针,指向函数print();变量q是一个有两个整型参量返回值为int的指针,指向函数add()。
(未完待续)