C语言(七)---指针(二)

Python020

C语言(七)---指针(二),第1张

区别:

相同点

不同点

注意

在解释指针数组和数组指针之前先来解释下 数组的存储结构

那么它的存储结构如下图:

a[0]是a[ 0 ] [ 0 ]的地址 ,也是a数组的首地址

同理, a[1]是a[ 1 ] [ 0 ]的地址 ,a[2]是a[ 2 ] [ 0 ]的地址

任何数据都有地址,一级指针的值虽然是地址,但是这个地址做为一个数据也需要空间来存放,而二级指针就是就是来存储这个地址的。

打印结果:

二级指针可以直接访问二维数组吗?答案当然是不行的,那么如何访问二维数组呢?

通过指针数组间接访问数组

例如 malloc() 函数 ,或者自定义的函数如:

所谓的指针函数也没什么特别的,和普通函数相比就是指针函数返回一个指针

根据传参类型分类

一维数组:int arr[3]

二维数组:int arr[3] [3]

指针数组:int*p[3]

函数名:

可以思考下为什么要把一个函数的地址作为参数传递给另一个函数,要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。

下面我举个例子:

我们设计一个函数fun()来计算某个精确值,不同的人计算的精确值不一样,但是我们都调用fun()函数,起了冲突,重名了,怎么办?重写吗,也可以,但是我们还有其他办法,只需要把 各自的计算精确值的算法写成一个函数,再通过参数传递给fun().

这是递归调用。

可以把调用过程写成:

fun(x) // =7

{

if ((x/2)>1)

{

// fun(x/2)

int y=x/2 //y=3

fun(y) //if ((y/2 >1) fun(y/2)else printf("%5d",y)

} // if 语句结束

printf("%5d",x)

}

x=7进入函数,x/2 >1 条件满足,递归调用 fun(y)[y=x/2=7/2=3]

fun(y)执行 if ((y/2 >1) fun(y/2)else printf("%5d",y)

y/2=1 条件不满足,不继续递归调用,执行 else printf("%5d",y) 打印出 3.

// if 语句结束

printf("%5d",x) 打印 7 ,为何7,可以分析上面语句结构:

fun(7) 执行:

x=7 进函数体:

{

if ((x/2)>1) {一大堆东西 } // if 语句结束

printf("%5d",x) 打印 7

}

所以打印出: 3 7

字符H的对应ASCii码是48

字符A的对应ASCii码是41

两者相减差值为7

字符0的对应ASCii码是30

与7相加后和是37。

ASCii中值为37对应用字符是7

所以结果为字符7