C语言之指针(最全!!!,适合小白)
1.指针类型变量
指针:指针就是内存地址,指针类型变量不保存具体数据,保存的是其他变量的地址
2.地址##
假如a=100 取他的地址###
`a=100;`
printf("a=%p",&a);
printf("a=%x",&a);
printf("a=%p",&a);
&:是取地址符;%p:可以输出地址
%x:输出的是16进制的地址
%p:也是输出的16进制的地址
但是为什么生成出来的地址不一样呢?
在一次运行期间,没有把a指针的变量销毁,他的地址是不变的.
a=%d
//打印出来a=100,100是地址的内容
a=%d
&a=%p
#打印出来是a的内容所占的地址,即是a的地址
指针*p 可以取地址,也可以取内容,当*p
单独存在的时候是,他的内存空间存在着是形式地址,根据形式地址找到真实地址,然后修改值,当*p
跟数据类型存在的时候,例如int *p
,char *p
等是表示指针变量###
*p=&a`
当单独*p的时候
怎么理解这个过程呢?
int a;
int *p;
a=10;
p=&a;
定义一个变量a,和定义一个指针型变量p,3
a=10;
p=&a;
把10存放在变量a内存块中,把a的地址存放在变量p中,指针型只存放地址.
sizeof这个变量可以测量字节大小,怎么应用呢?
`printf("sizeof(int *)==%ld\n",sizeof(int *))`int * 表示整形指针类型占多大内存
`printf("sizeof(p)=%ld\n",sizeof(p))`
表示变量p占多少内存大小
3. 指针变量
怎么理解指针变量呢,看下列对比
结果
我们可以知道当定义一个整数型指针的时候,p里面存放的是a的地址,那么变量型指针的地址*p存放的是什么,我们可以了解到,是a的值,是什么原理呢?
*号叫做指针运算符,间接访问运算符,如果学过计算机操作系统,那么p的内容里面,叫做形式变量,根据形式变量,找实际变量,如果我们根据
*p=20;
更改p的值结果
a=20;
怎么理解这个呢
画个图表达一下!
原来a=100,a的地址是1,*p里存放a的地址1,令**p等于20,根据形式地址,找到a的值进行修改改成
a=20,a的地址是1
4.指针的运算
int a =0;
int *p;
char ch=0;
p=&a;
*p=10;
a=10;
ch=20;
p=&ch;
*p=100;
printf("%d\n",ch);
这里会出现报错,但是还是会出现结果打印结果为100,原因是
当数据在存储的时候,会将数据保存在头地址中而int *p中有四个字节大小,但是char 只有一个字节大小,在修改的时候,会将char 类型相邻的修改,所以会报错.
为什么都是4呢
原因,*p存的是地址,只有四位,不管基类型是什么
*后面跟p,p带标的事a的地址,**p等于a
printf("%d\n",(*p)++);
相当于a++;
printf("%d\n",++(*p));
相当于++a;
printf("%d",++*p);
++和p优先级一样,但是根据运算规则,从右往左运算,,所以现结合p,然后在++
printf("%d",*p++);
5.野指针与空指针
没有规定p是谁,p里面存的是谁的地址,p是野指针,运行不到printf.
没有规定p是谁,p里面存的是谁的地址,p是野指针,运行不到printf.
当执行完语句块的时候,已经销毁了b,p=50,谁也代表不了,是一个野指针.,但是当销毁b的时候,b内存空间内有销毁,销毁的只是数据,这时候p可以使用.