废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可。
说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要,
请自行加入printf调试即可。
转贴请注明出处,欢迎和我讨论,谢谢。
----------cofin_add
#include <stdio.h>
void fun(int m, char *((*p)[m]))
{
int i = 0;
char ** buf = (char **)p;
for(i=0;i<m;i++)
{
printf("%s ", *(buf+i));
}
printf("
");
}
void fun1(int m, char **buf)
{
int i = 0;
for(i=0;i<m;i++)
{
printf("%s ", *(buf+i));
}
printf("
");
}
int main(void)
{
char *buf[] = {"aa", "bb", "cc", "dd", "ee", "ff"}; //指针数组,其中的每一个变量(指针),指向第一个字符串的首地址。
char **pa = buf; //如何指向数组中的元素呢,因为其中的每一个元素都是指针,所以应该用二重指针指向它。
char **px = &buf[0]; //数组名就是数组元素的首地址,可以看到和上面是一样的。
char *(*pb)[6] = &buf; //如何指向指针数组本身?因为数组其中共有六个变量(有6个指针或者指针变量(地址)),故应该用数组指针来指向它,
//但是由于其中的变量是指针,所以应该在加一个*,纯属个人猜测,如果这个成立的话,也可以解释上面的为什么是用二重指针了,因为buf和&buf[0]等价
//也就是说,其实&buf[0] 是地址的地址(因为buf[0]本身存储的就是地址),应该用二重指针指向。
//一维数组再研究
int a[5] = {0}; //定义数组,有5个int型的变量
int *p1 = a; //定义指针指向数组中的元素
int (*p2)[5] = &a; //若是要指向这个数组本身,则需要用数组指针指向它,注意要加括号,[]比*优先级高。
//二维数组的指针研究
int aa[2][5] = {0};
int (*p3)[5] = aa; //指向二维数组中的元素,二维数组中的元素就是一维数组,参考指向一维数组的方法即可
int (*p4)[5] = &aa[0]; //和上面一样,数组的名字就是数组的首元素的地址,其实是一个地址,也就是一维数组的数组地址。
int *p5 = &aa[0][0]; //指向二维数组首元素(一维)的首地址,用int *p,类型刚好匹配
int (*p6)[2][5] = &aa; //指向二维数组本身的指针。总结:把定义中的数组名字换成指针,加()即可。
char *p = buf[1]; //buf[0] => 里面存的指针数组中的是第一个元素的地址,也就是直接把一个地址给他初始化
printf("buf[1] = 0x%x.
", buf[1]);
printf("sizeof(buf[1]) = %d.
", sizeof(buf[1]));
printf("buf[1] = 0x%x.
", buf[1]);
printf("sizeof(buf) = %d.
", sizeof(buf));
fun(sizeof(buf)/sizeof(buf[0]), &buf); //这里传的是数组指针的地址,类型推倒:原来是一个指针数组,char *pt[x],如果是
//普通数组的话,char a[x],若指向该数组本身则应该写作 char (*p)[x] = &a; 根据这一点,类比到指针数组也就是 :char *(*p)[x] = &pt;
fun1(sizeof(buf)/sizeof(buf[0]), buf); //同理
return 0;
}
运行结果: