#include <stdio.h>
#if 0
//数组指针与指针数组
int main(void)
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int in[5] = {0};
// 指针数组的实质是一个数组,存储的内容是指针变量:int *p[5];
int *p[5] ={NULL};
// 数组指针的实质是一个指针,指针指向的是一个数组:int (*p)[5];
int (*p1)[5] = NULL;
p[0] = &a;
p[1] = &b;
p[2] = &c;
p[3] = &d;
p[4] = &e;
// p1 = in; //错误,p1是数组指针,可以指向一个数组的地址,而in表示数组的首元素首地址
p1 = ∈//正确,&in是整个数组的地址,p1是数组指针,可以指向这个数组
printf("a[0]=%d\n",*p[0]);//解引用p[0]存的地址
return 0;
}
#endif
#if 0
//函数指针
void func(int a)
{
int b =20;
}
int main(void)
{
// func对应的类型为void (*) (int);
//对应的函数指针为
void (*p) (int) = func;//函数指针p指向了函数func
void (*p1) (int) = &func;//函数指针p指向了函数func的地址
//函数名表示第一句代码的地址,&func表示整个函数的地址
printf("sizeof(func)=%d,sizeof(&func)=%d",sizeof(func),sizeof(&func));
//sizeof(func)=1,sizeof(&func)=8有待考虑为什么
char *strcpy(char *dest, const char *src);
// 对应的函数指针是: 注意这里的char*是返回值类型
char *(*pFunc)(char *dest, const char *src);
return 0;
}
#endif
#if 0
// 二重指针:指针数组指针
void func(char **p)
{
*p =NULL;
}
int main(void)
{
char *p = NULL;//一重指针
char **pp = NULL;//二重指针
char *p1[5]={NULL};//指针数组
char a = 'a';
p = &a;
pp = &p;//正常
//二重指针指向指针数组
pp = p1;//编译可以通过,说明,二重指针和指针数组是相同的
// p1表示&p1[0];p1本质是数组名,这里也表示数组首元素首地址
// 数组的元素是char *类型的.故p1表示的是p1[0]这个char*元素
// 的指针.和pp的意义相同
// 函数传参时,为通过函数内部改变外部的指针变量指向的地址
printf("p1 = %p\n",p);
func(&p);
printf("p1 = %p\n",p);
return 0;
}
#endif
// 二维数组的两种访问方式
int main(void)
{
int a[2] = {1,2};
int *p = a;//可以用指针访问一维数组了
// printf("%d \n",*(p+1));
// 指针方式访问一维数组
// 二维数组和一位数组没有本质区别
int aa[2][3] = {1,2,3,4,5,6};//二维数组
int (*p2)[3] = aa;//数组指针指向二维数组
// 上面一行相当于:
int (*p3)[3] = &aa[0];
// 二维数组的第一维的首元素地址
// 相当与第二维数组整体的数组地址
aa[1][2] = 9;
printf("%d \n",*(*(aa+1)+2));
printf("%d \n",*(*(p2+1)+2));
printf("%d \n",*(*(p3+1)+2));
// *(p3+1)相当与第二维中的首元素地址
//这三个结果都是相同的
int * p4 = aa[0];
// int * p4 = &aa[0][0];//与上相同
printf("%d \n",*(p4+1));//aa[0][1]的值
return 0;
}
int (*p2)[第二维n];
//数组指针指向二维数组
二重指针指向指针数组
有些乱了0.0…