区别:
相同点 :
不同点 :
注意 :
那么它的存储结构如下图:
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