指针与数组,与函数,与指针

指针数组

指针数组就是一个数组,这个数组里面的元素是指针。

一般形式为: 类型标识符 * 数组名[数组长度]

比如

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()。

 

(未完待续)

猜你喜欢

转载自blog.csdn.net/qq_42379345/article/details/81254190