1.什么是指针变量?
例如int型变量存放的是整数、char存放的是字符。那存放地址的变量就是指针变量。也可以理解为指针就是地址。地址、地址、地址重要的事说三遍。
int a; //整形变量
char c; //字符变量
int *p //指针变量 用来存放别人地址的变量。注意(*只在定义指针变量是作为标识符来使用,其他时候都是作为取地址里的内容来使用。)
2.如何通过指针来访问变量?
int a=5;
char c=‘a’;
printf(" %d \n",a); //通过变量名来访问
printf(" %c \n",c); //通过变量名来访问
int p;
p=&a;
int p2;
p2=&c;
printf(" %p \n",p); /%p是用来打印p的地址的,注意p本身代表的是地址,要获取内容就要
printf(" %p \n",p2); 用来把内容取出来。
printf(" %d \n",*p);
printf(" %c \n",*p2); */
3.指针分类型,类型不同偏移值也不同。
对于int来说指针P++ 偏移4个字节。
对于char指针P++偏移1个字节。类型很多就不一一说明了。
指针和数组结合:注意(不是指针数组)
例子:
#include<stdio.h>
int main()
{
int array[3]={1,2,3};
int *parray;
int i;
parray=array; //表示数组可以用数组名也可以用首地址,&array【0】
for(i=0;i<3;i++){
printf(" %p\n",parray++);
}
return 0;
}
~
结果:
CLC@Embed_Learn:~/fuxi$ ./a.out
0x7fff788e39e0
0x7fff788e39e4
0x7fff788e39e8
如果遍历要注意指针的偏移值问题。
4.指针数组
什么是指针数组?
指针数组由多个指针组成,例如 int *p[3];
例子:
#include<stdio.h>
int main()
{
int array[3]={1,2,3};
int *p[3];
int i;
p[0]=&array[0];
p[1]=&array[1];
p[2]=&array[2];
for(i=0;i<3;i++){
printf(" %p\n",p[i]);
printf(" %d\n",*p[i]);
}
return 0;
}
结果:
0x7fff5fdae140
1
0x7fff5fdae144
2
0x7fff5fdae148
3
5,数组指针
什么是数组指针?
指向数组的一个指针。例如 int (*p)[3];
数组指针和指针数组偏移量的区别:
例子:
#include<stdio.h>
int main()
{
int a[3]={1,2,3};
int (*p)[3];
p=a;
int *p2;
p2 = a;
printf("p adress is %p\n",p);
printf("p2 adress is %p\n",p2);
printf("==============================\n");
printf("p++ adress is %p\n",++p);
printf("p2++ adress is %p\n",++p2);
return 0;
}
~
结果:
p adress is 0060FEEC
p2 adress is 0060FEEC
==============================
p++ adress is 0060FEF8
p2++ adress is 0060FEF0
请按任意键继续. . .
可以看到p数组指针偏移的大小是跨整个数组偏移3*4=12,p2指针数组偏移一个int 4个字节。
6.函数指针
例:void (*p)();
例子:
#include<stdio.h>
int add(int a,int b)
{
return a+b;
}
int main()
{
int (*padd)();
padd=add;
int ret=padd(1,2);
int ret2=(*padd)(1,2);
printf("ret=%d\n",ret); //可以有俩种调用一种直接调用,一种取内容再调用。一般直接调用
printf("ret2=%d\n",ret2);
return 0;
}
结果:
CLC@Embed_Learn:~/fuxi$ ./a.out
ret=3
ret2=3