0,一维数组
int a[]={3,4,5,7,3,6,6};
int *p=a;
printf("%p\n", p);
printf("%p\n", a);
printf("%p\n", &a[0]);
printf("%d\n", p[0]);
printf("%d\n", a[0]);
输出:
0x7ffeefbff5e0
0x7ffeefbff5e0
0x7ffeefbff5e0
3
3
1,二维数组
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4]=a;//指针p指向了一个二维的数组
printf("%p\n", a);
printf("%p\n", &a[0]);
printf("%p\n", a[0]);
printf("%p\n", &a[0][0]);
printf("%p\n", *p);
printf("%p\n", p);
输出:
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
分析图:
2,指向字符串的指针与字符数组
2.1指向字符串的指针
char*ptr="zfbanzhangzaiyiqi";
printf("%p\n", ptr);
printf("%s\n", ptr);
输出:
0x100000f9a
zfbanzhangzaiyiqi
分析:
"zfbanzhangzaiyiqi"是放在常量区的无法通过ptr指针去修改"zfbanzhangzaiyiqi"这个字符串
ptr指向了常量字符串"zfbanzhangzaiyiqi"的首地址,所以可以通过%s将全部字符串输出来
2.2字符数组
char str[]="zfbanzhangzaiyiqi";
printf("%s\n", str);
输出:
zfbanzhangzaiyiqi
分析:str在内存空间给zfbanzhangzaiyiqi是分配空间的,放在栈中的,所以可以通过str去修改"zfbanzhangzaiyiqi"
3,char型指针数组
char*name[]={
"aaaa","bb","ccc"
};
printf("%p\n", name);
printf("%p\n", &name[0]);
printf("%p\n", name[0]);//name[0]里面的内容是“aaaa”的首地址
printf("%p\n", &name[0][0]);//name[0]指向了name[0][0]的首地址
printf("%s\n", name[0]);//name[0]里面的所有字符串
输出:
0x7ffeefbff5f0
0x7ffeefbff5f0
0x100000f98
0x100000f98
aaaa
4,分析指针变量的类型以及指针指向的类型
int a=10;
int *p=&a;
printf("%p\n", p);
printf("%d\n", *p);
输出:
0x7ffeefbff5fc
10
分析:
指针p的类型:int*p中去除p后int*就是指针的类型即指向整型的指针
指向的类型:int*p中去除*p后就是指向的类型即整型
5,const关键字及使用
int a=10;
int *const p=&a; 代表常量指针,指针的指向不能变,但a变量可以改变
const int * p=&a; int const * p=&a; 或者代表指向常量的指针,指针的指向可以变,但a变量不可以改变
6,函数指针与指针函数
函数指针:指向函数类型的指针变量
先定义一个函数
int sum(int a,int b){
}
定义函数指针直接拷贝函数声明
int sum(int a,int b),然后将函数名替换int (*p)(int a,int b),a和b这里可以省略
然后指针初始化
p=sum;//p指向了sum函数
int result=p(23,45)//用函数指针间接的调用函数
例:(可类比第0条中指向一维数组指针的使用)
int sum(int a,int b){
return a+b;
}
int (*p)(int a,int b);
p=sum;
printf("%p\n", p);
printf("%p\n", sum);
printf("%p\n", &sum);
printf("%d\n", sum(2,3));
printf("%d\n", p(2,3));
输出:
0x100000eb0
0x100000eb0
0x100000eb0
5
5
指针函数:函数的返回值是指针