指针数组和二维数组做形参
#include <stdio.h>
/***
刚看到int * (*p)[]的时候对他的结构有些疑惑,
因为int (*p)[]的结构和它十分类似,int (*p)[]所定义的就是一维数组的地址形式,
要想理解相应关系可以做以下类比:
1. int * p int a p = &a;
2. int * (*p)[] int (*a)[] (*p)[] = &(*a)[];
有上述类比可以得到其实(*p)[]当中是存储(*a)[]的地址值得,而对于二维数组来讲,
当对首行数组的地址进行取址时,得到的就是二维数组本身的地址值了。由此可以得出
int * (*p)[]所代表的就是二维数组。
注:
二维数组的数组名所代表的就是首行数组的地址值,所以要想通过它得到二维数组
的地址值,那么就要对二维数组名进行取址。
***/
//void word_display(char *string[]){
void word_display(char * (*string)[]){
char **p;
// p = string;
p = *string;
for(int i = 0;i < 4;i++){
/***
二维数组名所代表的的就是首行数组的地址值。
由于优先级的关系,先执行p++,而后对p进行取值。
另外有上文知p是一个双重指针,它所指向的就是所定义的指针数组的地址,
而对它使用了一次取值符以后,*p所指向的就是里边第一个字符串的地址值了,
而*p++是对它的每一个字符串的地址进行遍历。
***/
printf("%s ", (*p++));
}
printf("\r\r\n");
p = *string;
/***
对二维数组当中每一个元素进行遍历
***/
printf("%c",*(*(p+3)+2));
}
int main(void){
char *string[] = {
"zjl",
"is",
"good",
"student.",
};
// word_display(string);
word_display(&string);
return 0;
}