先区分几个名称
- 变量:它对应在内存里是一个地址空间
- 变量名:只是一个名字,只有编译器知道它对应的地址是多少,常见的a,b,c就是变量名,a b c 是变量名代表 a,b,c三个变量,也对应这三个地址空间,空间里可以存放数据
- 指针:其实是一个地址,这个地址空间里可以放数据,如果放的刚好是a,b,c的数据,那么这个这三个数据的地址都会各自对应一个指针,可以用代表指针的变量
*pa=&a;
进行描述;指针本质就是一个地址,可以是变量a的地址,也可以是变量b的地址,也可以是数组中某个元素的地址,或者是数组的地址,当然这里需要知道数组的地址就是数组名字a所在的地址,也是元素a[0]的地址 - 指针变量:本质是一个变量,变量对应的其实是一个地址空间,只不过呢,这个地址里存的内容和普通的变量存的内容不一样,它这个变量对应的地址空间里存的是一个指针,也就是说存的其实是一个地址值,这就比较有意思了;
- 指针变量名:指针变量既然是变量当然也应该有名字,指针变量名可以叫pa,pb,pc,含义就是指存放某变量地址的名字;
再认识两个符号
- 取地址运算符:&
我的理解是取地址运算符针对的是有地址的变量来说的好比找房间门牌号的操作,门牌号其实可以看做是地址值;
- 取值运算符: *
取值运算符是针对有地址值的变量来说的,取得是变量所在地址里的值,有点像有了房间号需要一把钥匙才能把门打开一样,这个*号有点像是门钥匙的作用,能把地址空间的内容给取出来;
最后再验证几段代码
#include<stdio.h>
int main(void)
{
char a='F';//定义字符变量
int b=123;//定义整型变量
char *pa=&a;//定义字符变量指针指向a
int *pb=&b;//定义整型变量指针指向b
printf("a=%c\n",a);//直接访问变量a的值
printf("*pa=%c\n",*pa);//间接访问a变量值
printf("b=%d\n",b);//直接访问变量b的值
printf("*pb=%d\n",*pb);//间接访问变量b的值
*pa='c';//通过取值运算符进行操作变量的值
*pb+=1;
printf("现在a的值(*pa)=%c\n",*pa);
printf("现在b的值(*pb)=%d\n",*pb);//
printf("sizeof pa=%d\n",sizeof (pa));//开辟的指针所占字节
printf("sizeof pb=%d\n",sizeof (pb));
printf("a 的地址是:%p\n",pa);//打印变量的地址
printf("b 的地址是:%p\n",pb);
return 0;
}
结论:
通过指针也可以操作变量的值;
指向某个变量的指针就是这个变量的地址;
不同指向的指针变量所占字节大小相同,这里都为4个字节;
危险的指针-野指针
#include <stdio.h>
{
int *a;
*a=123;//野指针
return 0;
}
没有确定指向的指针是很危险的,有可能会造成程序的bug要十分注意,不能在程序中出现没有确定地址的指针;像这里的123的地址给a一样,根本不知道a的地址在哪里,那是不行的;
csdn一篇只能写这么多,但是总结完全没有进行完毕,明天继续搞指针…