C语言之指针(最全!!!,适合小白)

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中,指针型只存放地址.

15

16

sizeof这个变量可以测量字节大小,怎么应用呢?

`printf("sizeof(int *)==%ld\n",sizeof(int *))`int * 表示整形指针类型占多大内存
`printf("sizeof(p)=%ld\n",sizeof(p))` 

表示变量p占多少内存大小

3. 指针变量

怎么理解指针变量呢,看下列对比

17

结果

18

我们可以知道当定义一个整数型指针的时候,p里面存放的是a的地址,那么变量型指针的地址*p存放的是什么,我们可以了解到,是a的值,是什么原理呢?

*号叫做指针运算符,间接访问运算符,如果学过计算机操作系统,那么p的内容里面,叫做形式变量,根据形式变量,找实际变量,如果我们根据

*p=20;

更改p的值结果

a=20;

怎么理解这个呢7

画个图表达一下!

原来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 类型相邻的修改,所以会报错.

19

20

为什么都是4呢

原因,*p存的是地址,只有四位,不管基类型是什么

21

*后面跟p,p带标的事a的地址,**p等于a

printf("%d\n",(*p)++);

相当于a++;

printf("%d\n",++(*p));

相当于++a;

printf("%d",++*p);

++和p优先级一样,但是根据运算规则,从右往左运算,,所以现结合p,然后在++

printf("%d",*p++);

22

5.野指针与空指针

23

没有规定p是谁,p里面存的是谁的地址,p是野指针,运行不到printf.

25

24

26

没有规定p是谁,p里面存的是谁的地址,p是野指针,运行不到printf.

当执行完语句块的时候,已经销毁了b,p=50,谁也代表不了,是一个野指针.,但是当销毁b的时候,b内存空间内有销毁,销毁的只是数据,这时候p可以使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁生花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值